Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - Обработчик строк из текстового файла

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

Новый участник


Сообщения: 13
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


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

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|Лондон|ЛОНДОН, ВЕЛИКОБРИТАНИЯ|

Отправлено: 16:37, 02-08-2016

 

Аватара для lxa85

Необычный


Contributor


Сообщения: 4466
Благодарности: 995

Профиль | Сайт | Отправить PM | Цитировать


pageYK@fb, в чем возникла проблема?
Где рассуждения?

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)


Отправлено: 14:31, 03-08-2016 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


lxa85, «рассуждения» были здесь: CMD/BAT - [решено] обработка в подстроке.

Отправлено: 14:50, 03-08-2016 | #3


Новый участник


Сообщения: 13
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


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

Отправлено: 17:47, 03-08-2016 | #4


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


Цитата pageYK@fb:
delimited опробовал, не зашло. »
Ну, так показывайте, как именно опробовали.

Отправлено: 18:44, 03-08-2016 | #5


Аватара для shisik

Ветеран


Сообщения: 3307
Благодарности: 599

Профиль | Отправить PM | Цитировать


Цитата pageYK@fb:
А так затык, в основном, как в Delphi индентифицировать в строке это третье число, delimited опробовал, не зашло. »
А что если написать функцию разделения строки по типу питоновской 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, уж простите, если накосячил.
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:28, 03-08-2016 | #6


Аватара для opel431

Ветеран


Contributor


Сообщения: 1803
Благодарности: 714

Профиль | Отправить PM | Цитировать


Вся "работа" вокруг анализа одной "колонки"... не нужно что-то выдумывать. Для выделения подстроки в 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, 04-08-2016 в 00:51.

Это сообщение посчитали полезным следующие участники:

Отправлено: 23:00, 03-08-2016 | #7


Новый участник


Сообщения: 13
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


Из вышестоящего, собрал вот такой кусок:

Код: Выделить весь код
var 
  i,l:integer;
  ts:TStringList;
  s: string;

begin

ts := TStringList.Create;                      

  try
    ts.LoadFromFile('1.txt');
    Delimiter := '|';
    StrictDelimiter := True;
    DelimitedText := ts;
    for l:=0 to ts.Count-1 do
      begin

        value := StrToInt(ts.Strings[2]);
        while value>394 do
        begin
         value := value-394;
         ts.Strings[2]:=IntToStr('394');
         // Как передать обновленную строку в файл?
        end;
         ts.Strings[2]:=IntToStr(value);
         // передача строки в файл с остатком.
      end;
      // сортировка

      finally
    ts.Free;
  end;

end.
Как прописать запись строки в файл из цикла, через append?

Отправлено: 14:24, 04-08-2016 | #8


Аватара для opel431

Ветеран


Contributor


Сообщения: 1803
Благодарности: 714

Профиль | Отправить PM | Цитировать


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

-------
Хвала тому, кто встав среди камней, уча другого, сам будет умней.


Последний раз редактировалось opel431, 04-08-2016 в 17:45.


Отправлено: 15:27, 04-08-2016 | #9


Новый участник


Сообщения: 13
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


opel431, Методов хватает, работает не так как надо.
Код
Код: Выделить весь код
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
Лондон
ЛОНДОН,
ВЕЛИКОБРИТАНИЯ".

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

Отправлено: 11:03, 08-08-2016 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - Обработчик строк из текстового файла

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Сборка текстового файла из содержимого другого текстового файла icomboy Скриптовые языки администрирования Windows 0 10-09-2013 15:17
CMD/BAT - [решено] Вывод строк текстового файла, начиная с одной и заканчивая другой Bruce Wayne Скриптовые языки администрирования Windows 5 07-08-2013 07:32
VBS/WSH/JS - [решено] из строк текстового файла нужно вырезать определенные символы alek2012 Скриптовые языки администрирования Windows 10 11-07-2012 16:54
CMD/BAT - Поиск и копирование нескольких строк из текстового файла. valen Скриптовые языки администрирования Windows 0 07-11-2011 17:27
CMD/BAT - [решено] Перенос и удаление строк из текстового файла sk8ter Скриптовые языки администрирования Windows 15 03-10-2010 19:35




 
Переход