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

Компьютерный форум 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

 

Аватара для opel431

Ветеран


Contributor


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

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


Цитата pageYK@fb:
Методов хватает, работает не так как надо. »
Инструментов под рукой нет, но на вскидку - вы же заперли сохранение в цикл вычислений
Код: Выделить весь код
while value>394 do
        begin
           ...
           ...
           ??? ts.SaveToFile('2.txt');
        end;
да и никто вас не ограничивает работой с одним списком?

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


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



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

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


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


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

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


opel431,
Проблема заключается в том, что делиметр разделяет строку на подстроки, а как обратно конкатенировать для записи в файл непонятно.

Отправлено: 14:36, 08-08-2016 | #12


Аватара для lxa85

Необычный


Contributor


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

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


pageYK@fb, есть строка, разбитая на под строки.
Что вам мешает собрать ее обратно?
Если у вас формат файла фиксирован, то и собирайте в цикле
Код: Выделить весь код
str = "";
for i = 1 to n do
    str = str+"|"+delimiters[i];
Соотв n - кол-во частей строк
delimiters - полученный "конструктор" подстрочек
str - результирующая строка

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


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


Ветеран


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

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


opel431, lxa85, а какого-нибудь аналога basic'овского «Join()» в Delphi нету разве?

Отправлено: 15:48, 08-08-2016 | #14


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


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

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


lxa85, opel431,
Строки разбиваются (при delimiter = "|") на отделяемое запятыми тоже, поэтому обратно приведенным вами способом не соберешь.
Вот почему мне не нравится этот метод через делимитедтекст.
Поэтому прошу выкладывать решение, а не функцию которую можно применить.(уже n-раз выходит, что возникают только доп.вопросы)

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


Аватара для lxa85

Необычный


Contributor


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

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


Iska, честно, не знаю
pageYK@fb, что значит "не соберешь"?
Что отладчик говорит? Что говорят watchdog'и?
Что в полученных структурах, что на выходе?
Вы хоть какую-то информацию к размышлениям давайте.

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


Отправлено: 16:48, 08-08-2016 | #16


Аватара для opel431

Ветеран


Contributor


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

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


Встроенного аналога, с параметром разделителя, не нашел (есть обычная Concat), заменяющая +. Так что, или ее или ручками.
pageYK@fb, нужно с интересом подходить к своей задаче. Поковыряюсь параллельно с вами.

Поставил триальный XE4, нашел в справочнике функцию SplitString (функция есть, как минимум с XE) и .... Для наглядность, применил TMemo.
pageYK@fb, дальнейшие "телодвижения" (сортировка, адаптация, оптимизация и все, что вам требуется, делайте сами).

SplitString+
Код: Выделить весь код
......
var
  Form1: TForm1;
  ts: TStringList;
......

procedure TForm1.Button1Click(Sender: TObject);
var
  i, n, value: integer;
begin
  if FileExists(ExtractFilePath(Application.ExeName) + '1.txt') then
  begin
    ts := TStringList.Create;

    try
      ts.LoadFromFile(ExtractFilePath(Application.ExeName) +'1.txt');

      for i := 0 to ts.Count - 1 do
      begin
        value := StrToInt((SplitString(ts.Strings[i], '|')[2]));
        n := StrToInt(SplitString(ts.Strings[i], '|')[0]);

        if value > 394 then
          Memo1.Lines.Add(IntToStr(n) + '|' + (SplitString(ts.Strings[i], '|')[1])
            + '|' + IntToStr(value) + '|' + (SplitString(ts.Strings[i], '|')[3]) +
            '|' + (SplitString(ts.Strings[i], '|')[4]) + '|');

        while value > 394 do
        begin
          value := value - 394;
        end;
        n := StrToInt(SplitString(ts.Strings[i], '|')[0]) + 1;
        Memo1.Lines.Add(IntToStr(n) + '|' + (SplitString(ts.Strings[i], '|')[1]) +
        '|' + IntToStr(value) + '|' + (SplitString(ts.Strings[i], '|')[3]) + '|'
        + (SplitString(ts.Strings[i], '|')[4]) + '|');
      end;

    finally
      Memo1.Lines.SaveToFile(ExtractFilePath(Application.ExeName) +'2.txt');
      FreeAndNil(ts);
    end;
  end;
end;
Результат
1|325230ш5ш3|438|Лондон|ЛОНДОН, ВЕЛИКОБРИТАНИЯ|
2|325230ш5ш3|44|Лондон|ЛОНДОН, ВЕЛИКОБРИТАНИЯ|
3|32523лпукп4|22|Европа|ДУБЛИН, ИРЛАНДИЯ|
4|32епкупщ4пп|21|Венгрия|БУДАПЕШТ, ВЕНГРИЯ|

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


Последний раз редактировалось opel431, 09-08-2016 в 15:30.

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

Отправлено: 19:54, 08-08-2016 | #17


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


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

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


opel431,
Спасибо за splitstring, а memo работает только на кнопке, была бы привязка к форме. Спасибо, и на этом.

Отправлено: 12:22, 11-08-2016 | #18


Аватара для opel431

Ветеран


Contributor


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

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


Цитата pageYK@fb:
а memo работает только на кнопке »
Форма имеет достаточно обработчиков событий для решения ваших желаний.

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


Отправлено: 13:40, 11-08-2016 | #19



Компьютерный форум 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




 
Переход