Я сделал за 1 час на Паскале потому что
1) Единственный язык общего назначения, которым я владею профессионально.
2) Были самописные полезные функции обработки строк.
А как лучше? Какой язык, по вашему мнению, больше подходит для этой задачи?
Вот код:
- Код: Выделить всё
program tmpconverter;
{$mode objfpc}{$h+}
uses Classes, SysUtils, TAVStrUtils, simple_sql, simple_oper ;
var List,List1,ListOut,ListCountry,ListProp:TStringList ;
i:Integer ;
tekcountry:string ;
floor,floorall:string ;
const
ROOMTYPE_ID=1 ;
begin
ListOut:=TStringList.Create ;
ListCountry:=TStringList.Create ;
if FileExists('country') then ListCountry.LoadFromFile('country') ;
List:=TStringList.Create ;
List.LoadFromFile(ParamStr(1)) ;
for i:=0 to List.Count-1 do begin
if StripChars(Trim(List[i]),'@')='' then Continue ;
List1:=CreateStringListBySep(List[i],'@') ;
if List1.Count=0 then begin end
else begin
Writeln(tekcountry) ;
if Trim(List1[1])<>'' then tekcountry:=Trim(List1[1]) ;
if ListCountry.IndexOf(tekcountry)=-1 then ListCountry.Add(tekcountry) ;
if Trim(List1[10])='' then Continue ;
ListProp:=TStringList.Create ;
if Trim(List1[12])<>'' then ListProp.Values['Источник']:=Trim(List1[12]) ;
if Pos('/',List1[3])<>0 then begin
floor:=Trim(GetSplitPart1(List1[3],'/')) ;
floorall:=Trim(GetSplitPart2(List1[3],'/')) ;
end
else begin
floor:=Trim(List1[3]) ;
floorall:=Trim(List1[4]) ;
end ;
ListProp.Values['Этаж']:=floor ;
ListProp.Values['Этажность']:=floorall ;
ListOut.Add(Format('INSERT INTO ROOMS (ID, OPERTYPE_ID, ROOMTYPE_ID, '+
'COUNTRY_ID, OWNER_ID, REMARK, DATEENTER, LAST_UPDATE, PRICE, S, PROPSTORE, CONTACT) '+
' VALUES (GEN_ID(GEN_ROOMS_ID,1), 1, %d, %d, -1,''%s'',%s,%s,%d,%d,''%s'',''%s'');',[ROOMTYPE_ID,
ListCountry.IndexOf(tekcountry)+1,
PrepStringForSQLFB(List1[2]+' '+List1[13]+' '+List1[16]+' '+List1[17]),
Alternate(Trim(List1[11])='','''Now''',''''+Trim(List1[11])+''''),
Alternate(Trim(List1[11])='','''Now''',''''+Trim(List1[11])+''''),
Round(StrToIntWt0(StripExceptDigits(List1[8]))/1000),
StrToIntWt0(GetSplitPart1orAll(GetSplitPart1orAll(GetSplitPart1orAll(GetSplitPart1orAll(List1[5],','),'.'),'/'),'\')),
PrepStringForSQLFB(ListProp.CommaText),
PrepStringForSQLFB(List1[10])
])) ;
end ;
List1.Free ;
end ;
List.Free ;
ListOut.SaveToFile('out_'+IntToStr(ROOMTYPE_ID)+'.sql') ;
ListCountry.SaveToFile('country') ;
with TStringList.Create() do begin
for i:=0 to ListCountry.Count-1 do
Add(Format('INSERT INTO COUNTRIES(ID, CITY, COUNTRY) VALUES (%d,''city'',''%s'');',
[i+1,ListCountry[i]])) ;
SaveToFile('country.sql') ;
Free ;
end ;
ListOut.Free ;
ListCountry.Free ;
end.
Функции, которые нестандартные (мои):
1) StripChars - удаляет из первого параметра все символы, входящие во второй параметр
2) CreateStringListBySep - создает TStringList, расщепляя строку по заданному символу
3) GetSplitPart1 - первая часть строки, по заданному разделителю
4) GetSplitPart2 - вторая часть строки, по заданному разделителю
5) GetSplitPart1orAll - первая часть строки, по заданному разделителю, если разделитель не найден - вся строка.
6) PrepStringForSQLFB - подготовка строки к записи в SQL
7) StripExceptDigits - убрать из строки все, кроме цифр
Alternate - аналог С-конструкции a?b:c
9) StrToIntWt0 - если строка пустая, то вернет 0, иначе работает как StrToInt