Delphi - Обработчик строк из текстового файла

Аватара пользователя
pageYK@fb

Delphi - Обработчик строк из текстового файла

Сообщение pageYK@fb »

Есть файл с текстом формата(разделитель '|'):



1|325230ш5ш3|438|Лондон|ЛОНДОН, ВЕЛИКОБРИТАНИЯ|

2|32523лпукп4|22|Европа|ДУБЛИН, ИРЛАНДИЯ|

3|32епкупщ4пп|21|Венгрия|БУДАПЕШТ, ВЕНГРИЯ|



Нужно пропарсить его

(

1. Если в 3-ем числе >394, то вычитаем из него 394(строку дублируем),остаток оставляем новой строкой.(учесть, что операция должна быть циклична, т.к. встречаются числа больше 792)

2. Отсортировать строки по 3-ему числу. (1-ое число - счетчик)

)

, чтобы на выходе получилось это:



1|32епкупщ4пп|21|Венгрия|БУДАПЕШТ, ВЕНГРИЯ|

2|32523лпукп4|22|Европа|ДУБЛИН, ИРЛАНДИЯ|

3|325230ш5ш3|46|Лондон|ЛОНДОН, ВЕЛИКОБРИТАНИЯ|

4|325230ш5ш3|394|Лондон|ЛОНДОН, ВЕЛИКОБРИТАНИЯ|
Аватара пользователя
lxa85

Re: Delphi - Обработчик строк из текстового файла

Сообщение lxa85 »

pageYK@fb, в чем возникла проблема?

Где рассуждения?
Аватара пользователя
lxa85

Re: Delphi - Обработчик строк из текстового файла

Сообщение lxa85 »

lxa85, рассуждениями поделились ссылочкой выше.

А так затык, в основном, как в Delphi индентифицировать в строке это третье число, delimited опробовал, не зашло.
Аватара пользователя
Iska

Re: Delphi - Обработчик строк из текстового файла

Сообщение Iska »

Цитата pageYK@fb:



delimited опробовал, не зашло.
Delphi - Обработчик строк из текстового файла




Ну, так показывайте, как именно опробовали.
Аватара пользователя
pageYK@fb

Re: Delphi - Обработчик строк из текстового файла

Сообщение pageYK@fb »

Цитата pageYK@fb:



А так затык, в основном, как в Delphi индентифицировать в строке это третье число, delimited опробовал, не зашло.
Delphi - Обработчик строк из текстового файла




А что если написать функцию разделения строки по типу питоновской split или пхпшной explode? Примерно так:





Код:

Код: Выделить всё

function split(splitter: Char; str: String): TStringList;
var substr: String;
var parts: TStringList;
var i: Integer;
begin
  parts := TStringList.Create;
  for i := 1 to Length(str) do
     begin
       if str[i] = splitter then
       begin
         parts.add(substr);
         substr := '';
       end else
         substr := substr + str[i];
     end;
  parts.add(substr);
  result := parts;
end;

Соответственно, на выходе имеем TStringList, где третье число - parts[2]. Ну а дальше в Integer преобразовать проще простого:





Код:

Код: Выделить всё

var value: Integer;
...
value := StrToInt(parts[2]);

P.S. 100 лет не писал на Delphi, уж простите, если накосячил.
Аватара пользователя
shisik

Re: Delphi - Обработчик строк из текстового файла

Сообщение shisik »

Вся "работа" вокруг анализа одной "колонки"... не нужно что-то выдумывать. Для выделения подстроки в Delphi все есть


ExtractStrings




Код:

Код: Выделить всё

const
  str = '1|325230ш5ш3|438|Лондон|ЛОНДОН, ВЕЛИКОБРИТАНИЯ|'; // для примера одна строка
var
  sl: TStringList;
begin
  sl := TStringList.Create;
  begin
    try
      ExtractStrings(['|', ','], [' '], str, sl); // Note: ExtractStrings does not add empty strings to the list.
      ShowMessage(sl[2]);
    finally
      sl.Free;
    end;
  end;





Delimiter




Код:

Код: Выделить всё

const
  str = '1|325230ш5ш3|438|Лондон|ЛОНДОН, ВЕЛИКОБРИТАНИЯ|';
var
  i: Integer;
begin
  with TStringList.Create do
  begin
    Delimiter := '|';
    StrictDelimiter := True;
    DelimitedText := str;
    {for i := 0 to Count - 1 do
        ShowMessage(Strings[i]);}
    ShowMessage(Strings[2]);
    Free;
  end;




все остальные действия от обработки результата.
Аватара пользователя
opel431

Re: Delphi - Обработчик строк из текстового файла

Сообщение opel431 »

Вся "работа" вокруг анализа одной "колонки"... не нужно что-то выдумывать. Для выделения подстроки в Delphi все есть


ExtractStrings




Код:

Код: Выделить всё

const
  str = '1|325230ш5ш3|438|Лондон|ЛОНДОН, ВЕЛИКОБРИТАНИЯ|'; // для примера одна строка
var
  sl: TStringList;
begin
  sl := TStringList.Create;
  begin
    try
      ExtractStrings(['|', ','], [' '], str, sl); // Note: ExtractStrings does not add empty strings to the list.
      ShowMessage(sl[2]);
    finally
      sl.Free;
    end;
  end;





Delimiter




Код:

Код: Выделить всё

const
  str = '1|325230ш5ш3|438|Лондон|ЛОНДОН, ВЕЛИКОБРИТАНИЯ|';
var
  i: Integer;
begin
  with TStringList.Create do
  begin
    Delimiter := '|';
    StrictDelimiter := True;
    DelimitedText := str;
    {for i := 0 to Count - 1 do
        ShowMessage(Strings[i]);}
    ShowMessage(Strings[2]);
    Free;
  end;




все остальные действия от обработки результата.
Аватара пользователя
pageYK@fb

Re: Delphi - Обработчик строк из текстового файла

Сообщение pageYK@fb »

Цитата pageYK@fb:



Как прописать запись строки в файл из цикла, через append?
Delphi - Обработчик строк из текстового файла




Разве методов TStringList (add, insert, delete и прочих, для выполнения задачи, не хватает? Вариантов много, можно вообще все сделать в TSL (например, копирование нужной строки в конец списка add() с заменой подстроки StringReplace) и сохранением в файл SavetoFile.
Аватара пользователя
opel431

Re: Delphi - Обработчик строк из текстового файла

Сообщение opel431 »

opel431, Методов хватает, работает не так как надо.



Код

[spoiler]Код:
[/spoiler]

Код: Выделить всё

var 
  i,l,value:integer;
  ts:TStringList;
  s: string;
begin  ts := TStringList.Create;                    
  try
    ts.LoadFromFile('1.txt');
    ts.Delimiter := '|';
    for l:=0 to ts.Count-1 do
      begin
        ts.DelimitedText := ts.Strings[l];
        value := StrToInt(ts.Strings[2]);
        while value>394 do
        begin
         value := value-394;
         ts.Strings[2]:='394';
         ts.SaveToFile('2.txt');
        end;
      end;
      finally
    ts.Free;
  end;







SaveToFile по итогу, возвращает в файл текст уже разбитый на подстроки:

"1

325230ш5ш3

438

Лондон

ЛОНДОН,

ВЕЛИКОБРИТАНИЯ".



И как оперировать с несколькими строками для их сортировки так мне осталось неясным.
Ответить

Вернуться в «Программирование и базы данных»