Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.12.2012, 13:32   #1
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,893
Вопрос Парсинг данных *.txt

Есть файл, в котором есть данные вида
--->---
Понедельник (2012-07-21 21:51:13)
Заметки
---<---
Вторник (2012-07-22 00:44:49)
Заметки
Заметки
Заметки
--->---
Среда (2012-07-22 11:31:18)
Заметки
---<---
Четверг (2012-07-22 12:55:59)
--->---
Пятница (2012-12-03 16:38:24)

где --->--- исходящий, ---<--- входящий
Всё это загружается в StringList.

По всей видимости, парсить нужно снизу вверх до --->--- или ---<--- с последующим удалением.

Код:
s1 := 'Заметки#13#10Заметки' - n-ое количество сторок
s2 := 'Пятница (2012-12-03 16:38:24)' - статично только одна строка
Столкнулся с проблемой реализации парсера, через for или while и вообще без понятия, как будет выглядеть сам парсер. Может у кого какие идеи есть?

Последний раз редактировалось Shouldercannon; 27.12.2012 в 09:57.
Shouldercannon вне форума Ответить с цитированием
Старый 26.12.2012, 13:39   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
Может у кого какие идеи есть?
Нет, не понятен конечный результат - что найти, когда остановиться, в каком виде получить результат
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 26.12.2012, 15:29   #3
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,893
По умолчанию

Беря за основу содержимое файла на выходе мы должны получить:

Понедельник (2012-07-21 21:51:13)
Заметки
Вторник (2012-07-22 00:44:49)
Заметки
Заметки
Заметки
Среда (2012-07-22 11:31:18)
Заметки
Четверг (2012-07-22 12:55:59)
Пятница (2012-12-03 16:38:24)

--->--- и ---<--- служат как разделители и показатели, что было получено, а что отправлено.
Shouldercannon вне форума Ответить с цитированием
Старый 26.12.2012, 15:41   #4
Lardes
Форумчанин
 
Аватар для Lardes
 
Регистрация: 19.08.2011
Сообщений: 329
По умолчанию

Для парсинга посоветовал бы регулярные выражения. А "Есть файл, в которм есть данные вида" изменить можно? Просто почему спрашиваю - к тому, что как заметил Аватар - "не понятен конечный результат - что найти, когда остановиться". реально не понятно по каким критериям составлять регулярку
Lardes вне форума Ответить с цитированием
Старый 26.12.2012, 15:44   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  sl: tstringlist;
  i: integer;
begin
  sl := tstringlist.Create;
  sl.LoadFromFile('in.txt');
  i := 0;
  with RichEdit1 do
  begin
    Clear;
    Lines.BeginUpdate;
    while i < sl.Count do
    begin
      if sl[i] = '--->---' then
        SelAttributes.Color := clred
      else if sl[i] = '---<---' then
        SelAttributes.Color := clgreen
      else
      begin
        Lines.Add(sl[i]);
        SelAttributes.Color := clblack;
      end;
      inc(i);
    end;
    Lines.EndUpdate;
  end;
  sl.Free;
end;
Правда, это всего лишь раскраска текста.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 26.12.2012, 15:55   #6
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,893
По умолчанию

BDA
То, что нужно

Последний раз редактировалось Shouldercannon; 27.12.2012 в 05:00.
Shouldercannon вне форума Ответить с цитированием
Старый 27.12.2012, 05:01   #7
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,893
По умолчанию

BDA
Можно модернизировать код, чтобы после --->--- или ---<--- первая строка всегда добавлялась через процедуру обрабоки A, а все последующие до следующего разделителя --->--- или ---<---, или конца содержимого StringList, если нет больше разделителей через процедуру обработки B?

Последний раз редактировалось Shouldercannon; 27.12.2012 в 09:58.
Shouldercannon вне форума Ответить с цитированием
Старый 27.12.2012, 10:42   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Вроде работает:
Код:
procedure adderA(var i: integer; const sl: tstringlist; var rtext: TRichEdit);
begin
  if sl[i] = '--->---' then
    rtext.SelAttributes.Color := clred
  else if sl[i] = '---<---' then
    rtext.SelAttributes.Color := clgreen;
  rtext.Lines.Add(sl[i + 1]);
  i := i + 2;
end;

procedure adderB(i, j: integer; const sl: tstringlist; var rtext: TRichEdit);
begin
  rtext.SelAttributes.Color := clblack;
  while i <= j do
  begin
    rtext.Lines.Add(sl[i]);
    inc(i);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  sl: tstringlist;
  i, j: integer;
begin
  sl := tstringlist.Create;
  sl.LoadFromFile('in.txt');
  i := 0;
  with RichEdit1 do
  begin
    Clear;
    Lines.BeginUpdate;
    while i < sl.Count do
    begin
      if (sl[i] = '--->---') or (sl[i] = '---<---') then
        adderA(i, sl, RichEdit1);
      j := i;
      while (j < sl.Count) and (sl[j] <> '--->---') and (sl[j] <> '---<---') do
        inc(j);
      adderB(i, j - 1, sl, RichEdit1);
      i := j;
    end;
    Lines.EndUpdate;
  end;
  sl.Free;
end;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 04.06.2013, 09:42   #9
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,893
По умолчанию

Подскажите пожалуйста, как вывести последние две строки с тем же текстом, что в шапке темы. В данном случае понадобиться обратный парсинг.
Код:
var
  SL: TStringList;
  i: Integer;
  procA: Boolean;
  s: string;
begin
  procA := False;

  SL := TStringList.Create;
  try
    SL.LoadFromFile('test.txt');
  except
  end;

  Memo1.Clear;
  i := 0;

  while i < SL.Count do
  begin
    s := SL[i];
    procA := procA or (s = '----->-----') or (s = '-----<-----');

    if (s = '----->-----') then Memo1.Lines.Add('>>>>>>') else if (s = '-----<-----') then Memo1.Lines.Add('<<<<<<')
    else
    begin
      if procA then
      begin
        procA := False;
        Memo1.Lines.Add(s);
      end
      else Memo1.Lines.Add(s);
    end;

    Inc(i);
  end;

  SL.Free;
end;

Последний раз редактировалось Shouldercannon; 04.06.2013 в 11:32.
Shouldercannon вне форума Ответить с цитированием
Старый 02.01.2017, 12:03   #10
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,893
По умолчанию

Помогите, пожалуйста реализовать.
Имеется
PHP код:
--->---
Среда (2012-07-22 11:31:18)
Заметки
---<---
Четверг (2012-07-22 12:55:59)
--->---
Пятница (2012-12-03 16:38:24
Здесь разделитель/вход в новый блок --->--- или ---<---
Если у какого-то из блоков нет этого разделителя, то пропустить его, вообще ничего из него не выводить

Например
PHP код:
--->---
Понедельник (2012-07-21 21:51:13)
Заметки
---<---
Вторник (2012-07-22 00:44:49)
Заметки
Заметки
Заметки
--->---
Среда (2012-07-22 11:31:18)
Заметки
---<---
Четверг (2012-07-22 12:55:59)
--->---
Пятница (2012-12-03 16:38:24
На выходе даст

Понедельник (2012-07-21 21:51:13)
Заметки
Вторник (2012-07-22 00:44:49)
Заметки
Заметки
Заметки
Среда (2012-07-22 11:31:18)
Заметки
Четверг (2012-07-22 12:55:59)
Пятница (2012-12-03 16:38:24)

PHP код:
--->---
Понедельник (2012-07-21 21:51:13)
Заметки

Вторник 
(2012-07-22 00:44:49)
Заметки
Заметки
Заметки
--->---
Среда (2012-07-22 11:31:18)
Заметки
---<---
Четверг (2012-07-22 12:55:59)
--->---
Пятница (2012-12-03 16:38:24
В данном случае Вторник (2012-07-22 00:44:49) не имеет разделитель (--->--- или ---<---). На выходе должно получится

Понедельник (2012-07-21 21:51:13)
Заметки
Среда (2012-07-22 11:31:18)
Заметки
Четверг (2012-07-22 12:55:59)
Пятница (2012-12-03 16:38:24)

Последний раз редактировалось Shouldercannon; 02.01.2017 в 16:08.
Shouldercannon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Парсинг txt с разделителями табуляцией AlexKhol Общие вопросы Delphi 16 18.03.2012 18:33
Парсинг данных из Stringlist Lauri Общие вопросы Delphi 5 21.04.2011 20:22
Парсинг данных Shouldercannon Общие вопросы Delphi 2 09.07.2010 13:14
импорт из txt, работа с массивом данных, экспорт в txt Danara Microsoft Office Excel 4 31.03.2010 00:26
Парсинг полученных данных Shouldercannon Общие вопросы Delphi 11 09.01.2010 21:47