Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.226.177.223] |
|
Сообщ.
#1
,
|
|
|
Есть строки такого типа:
Nomer_tovara: 557436 Brend: VMS Garantiya: 2343454 Year : 2019 Nomer_tovara: 557436 Brend: ORP Garantiya: 78788777 Year : 2019 Cтроки постоянно повторяются. Как вытянуть текст после Brend: и Garantiya: и Соединить их через знак двоеточие :. Выходной файл должен быть: VMS:2343454 ORP:78788777 Cделан код, работает: var sl, sl_out: TStringList; i: Integer; s: string; begin sl := TStringList.Create; sl_out := TStringList.Create; sl.NameValueSeparator := ':'; sl.LoadFromFile(...); for i := 0 to sl.Count - 1 do begin if sl.Names[i] = 'Brend' then s := Trim(sl.ValueFromIndex[i]); if sl.Names[i] = 'Garantiya' then begin s := s + ':' + Trim(sl.ValueFromIndex[i]); sl_out.Add(s); end; end; sl_out.SaveToFile(...); sl_out.Free; sl.Free; end; Как сделать код через AssignFile , writeln(f1, S);. Делаю вот так: Набросал заготовку: (Помогите допилить код ) procedure TForm1.Button1Click(Sender: TObject); var fall, f1: TextFile; S,sl: string; mas: array of string; Found: Boolean; i: integer; begin //Открываем диалог выбора файла if OpenDialog1.Execute then begin AssignFile(fall, OpenDialog1.FileName); reset(fall); AssignFile(f1, ExtractFileDir(OpenDialog1.FileName)+'\Result.txt'); rewrite(f1); end; //работаем по строкам в файле while not Eof(fall) do begin //читаем строку ReadLn(fall, S); // Вот тут как правильно прописать цикл ? writeln(f1, S); end; CloseFile(fall); CloseFile(f1); end; |
Сообщ.
#2
,
|
|
|
Цитата Kirilis2018 @ Есть строки такого типа: Т.е. каждый тип в отдельной строке и между каждыми элементами пустая строка? |
Сообщ.
#3
,
|
|
|
^D^ima, Каждый тип в отдельной строке. А вот между каждыми элементами не всегда пустая строка.
|
Сообщ.
#4
,
|
|
|
Var FIn,FOut:TextFile; I:Integer; SPart1,SPart2,S:String; begin AssignFile(FIn,'C:\1.txt'); Reset(FIn); AssignFile(FOut,'C:\2.txt'); Rewrite(FOut); I:=0; while not EOF(FIn) do Begin Inc(I); ReadLn(FIn,S); if Pos('Brend:',S)<>0 then SPart1:=Copy(S,Pos(':',S)+1,Length(S)-Pos(':',S)+2); if Pos('Garantiya:',s)<>0 then Begin SPart2:=Copy(S,Pos(':',S)+1,Length(S)-Pos(':',s)+2); WriteLn(FOut,Trim(SPart1)+':'+Trim(SPart2)); End; End; CloseFile(FIn); CloseFile(FOut); end; |
Сообщ.
#5
,
|
|
|
^D^ima, Идеальная работа кода, Спасибо Дмитрий!
|
Сообщ.
#6
,
|
|
|
Цитата Kirilis2018 @ Как сделать код через AssignFile , writeln(f1, S); var L: TStrings; s, s1, s2: string; fin, fout: TextFile; begin L := TStringList.Create; try AssignFile(fin, 'data.txt'); try Reset(fin); AssignFile(fout, 'data_out.txt'); try Rewrite(fout); while not Eof(fin) do begin Readln(fin, s); L.Clear; if ExtractStrings([':'], [], PChar(s), L) <> 0 then begin if L[0] = 'Brend' then s1 := Trim(L[1]); if L[0] = 'Garantiya' then s2 := Trim(L[1]); if (s1 <> '') and (s2 <> '') then begin Writeln(fout, Format('%s:%s', [s1, s2])); s1 := ''; s2 := ''; end; end; end; finally CloseFile(fout); end; finally CloseFile(fin); end; finally L.Free; end; end. С уважением ваш дельфист |
Сообщ.
#7
,
|
|
|
^D^ima, А еще такой вопрос по вашему коду:
А если текст такого же плана: Nomer_tovara: 557436 Brend: VMS Garantiya: 2343454 Year : 2019 Nomer_tovara: 557436 Brend: ORP Garantiya: 78788777 Year : 2019 Но нужно соединить вот так Garantiya + Nomer_tovara + Year: То есть на выходе: 2343454:557436:2019 78788777:557436:2019 То есть по сути дела как соединить данные в строках не по порядку. Что бы можно было любые данные соединять в любом порядке. |
Сообщ.
#8
,
|
|
|
меняйте местами SPart в любом порядке
WriteLn(FOut,Trim(SPart1)+':'+Trim(SPart2)); |
Сообщ.
#9
,
|
|
|
vasya2019, Это понял. А как то задать программно, что бы автоматически, программа определяла порядок нельзя ?
|
Сообщ.
#10
,
|
|
|
какой порядок должна программа определить автоматически?
|
Сообщ.
#11
,
|
|
|
vasya2019, к примеру текст в файле:
Nomer_tovara: 557436 Brend: VMS Garantiya: 2343454 Year : 2019 Nomer_tovara: 557436 Brend: ORP Garantiya: 78788777 Year : 2019 В Memo1 прописываю порядок (Настройки) - Garantiya + Nomer_tovara + Year: Получаю Результат текстовый файл: 2343454:557436:2019 78788777:557436:2019 |
Сообщ.
#12
,
|
|
|
Kirilis2018
У тебя строки точно не фиксированной длины? Между элементами в любом случаи строка? |
Сообщ.
#13
,
|
|
|
^D^ima, Строки точно (100% не фиксированной длины). Между элементами (не всегда пустая строка) бывает и слитно то есть вот так:
Nomer_tovara: 557436 Brend: VMS Garantiya: 2343454 Year : 2019 Nomer_tovara: 557436 Brend: ORP Garantiya: 78788777 Year : 2019 |
Сообщ.
#14
,
|
|
|
Миксуй как хочешь
Var FIn,FOut:TextFile; I:Integer; s:String; Sl:TStringList; begin Sl:=TStringList.Create; Sl.NameValueSeparator := ':'; AssignFile(FIn,'C:\1.txt'); Reset(FIn); AssignFile(FOut,'C:\2.txt'); Rewrite(FOut); I:=0; while not EOF(FIn) do Begin Inc(I); ReadLn(FIn,S); Sl.Add(S); if Trim(sl.Names[I-1])='Year' then begin WriteLn(FOut, Sl.Names[I-4]+':'+Trim(Sl.ValueFromIndex[I-4])+//Nomer_tovara Sl.Names[I-3]+':'+Trim(Sl.ValueFromIndex[I-3])+//Brend Sl.Names[I-2]+':'+Trim(Sl.ValueFromIndex[I-2])+//Garantiya Sl.Names[I-1]+':'+Trim(Sl.ValueFromIndex[I-1])//Year ); I:=0; sl.Clear; end; End; CloseFile(FIn); CloseFile(FOut); Sl.Free; end; |
Сообщ.
#15
,
|
|
|
^D^ima, Все разобрался. СПАСИБО!
|