Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 13.09.2013, 11:30
Elza Elza вне форума
Новичок
 
Регистрация: 14.05.2011
Сообщения: 57
Репутация: 10
По умолчанию Парсинг - Как сделать?

Добрый день. Помогите решить проблемку.

Имеется файл с данными, из которого, необходимо взять значения и поместить результаты в ListView с колонками.
У меня получается только спарсить одно значение и поместить в первую колонку. Вопрос как сделать, что бы достать все значения и заполнить ListView?
Пример того, что есть сейчас test.rar

Расскажите пожалуйста.
Ответить с цитированием
  #2  
Старый 13.09.2013, 12:54
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Я так понял, что 12.test это тот самый файл который надо парсить?
Тогда вот вам вопросы:
1. В нем содержится одна запись или несколько?
2. Если одна, то что является разделителем записей?
3. Длина записей одинакова или нет?
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 13.09.2013, 13:13
Elza Elza вне форума
Новичок
 
Регистрация: 14.05.2011
Сообщения: 57
Репутация: 10
По умолчанию

Да его
1. Он меняется, записей в нем много.
2. Разделители это запятая.
3. У каждой записи есть значение, формат такой
Код:
"data": "13.09.13" ,  "Следующее значение": "значение", и так далее
Одинаковой длинны только те данные, что находится в
Код:
"": 
а значения в "" до за пятой(Разделителя), будут разные.

Последний раз редактировалось Elza, 13.09.2013 в 13:18.
Ответить с цитированием
  #4  
Старый 13.09.2013, 15:32
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

В тему срочно призывается M.A.D.M.A.N.
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
Этот пользователь сказал Спасибо PhoeniX за это полезное сообщение:
Uniq! (13.09.2013)
  #5  
Старый 13.09.2013, 16:04
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Fus-Ro-Dah Используйте RegExp ДКА.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #6  
Старый 13.09.2013, 17:21
Elza Elza вне форума
Новичок
 
Регистрация: 14.05.2011
Сообщения: 57
Репутация: 10
По умолчанию

ужас, попробую...
Ответить с цитированием
  #7  
Старый 13.09.2013, 18:15
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
Fus-Ro-Dah Используйте RegExp ДКА.

Весь день дома не было. Увидел тему, не успел крикнуть, что нужно использовать RegExp

Для старта
Ответить с цитированием
  #8  
Старый 13.09.2013, 18:21
Elza Elza вне форума
Новичок
 
Регистрация: 14.05.2011
Сообщения: 57
Репутация: 10
По умолчанию

Цитата:
Сообщение от Uniq!
Весь день дома не было. Увидел тему, не успел крикнуть, что нужно использовать RegExp

Для старта

спасибо, читаю, но пока не смогла разобраться, посмотрим, что дальше будет
Ответить с цитированием
  #9  
Старый 13.09.2013, 18:37
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию

Идея простая:
1) у вас "однотипные строки"
2) собираем на языке "выражений" одну из этих строк
(я в этом слабоват, но попробую):

Код:
// добавляем
uses RegularExpressions;

procedure TForm1.Button1Click(Sender: TObject);
var
  RegExp: TRegEx; // класс регулярок
  Match: TMatch; // массив совпадений
  pattern: string;
begin
  // здесь шаблон, под который делфа будет
  // пытаться подставлять ваши строки
  // символика \d	[0-9]	Цифровой символ.
  // {n} - n символов (типа, те что стоят перед самими скобками).
  // в круглые скобки заключено то, что будет возвращаться в масси Matches - совпадения
  // (то, что вам нужно)
  // "data": "13.09.13" ,  "Следующее значение": "значение",
  pattern := '.*? (\d{2}.\d{2}.\d{2}), "\d(*.?)": "\d(.*?)"';
  RegExp := TRegEx.Create(pattern, [roIgnoreCase, roMultiline]);
  Match := RegExp.Match('сюда свой текс (мультистрочный)');
  // дальше не помню как разбирать Match массив
  // в инете можно глунять
  while Match.Success do
  begin
    WriteLn('Match : [' + Match.Value + ']');
  end;
  RegExp.Free;
end;

Код:
Символ	Эквивалент	Соответствие
\d	[0-9]	Цифровой символ.
\D	[^0-9]	Нецифровой символ.
\s	[ \f\n\r\t\v]	Пробельный символ.
\S	[^ \f\n\r\t\v]	Непробельный символ.
\w	[[:word:]]	Буквенный или цифровой символ или знак подчёркивания.
\W	[^[:word:]]	Любой символ, кроме буквенного или цифрового символа или знака подчёркивания.
Код:
Представление	Число повторений	Пример	Соответствие
{n}	Ровно n раз	colou{3}r	colouuur
{m,n}	От m до n включительно	colou{2,4}r	colouur, colouuur, colouuuur
{m,}	Не менее m	colou{2,}r	colouur, colouuur, colouuuur и т. д.
{,n}	Не более n	colou{,3}r	color, colour, colouur, colouuur

Последний раз редактировалось Uniq!, 13.09.2013 в 18:40.
Ответить с цитированием
  #10  
Старый 13.09.2013, 18:40
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Чо блин? Тут одного ДКА хватит. Детерминированный Конечный Автомат.
За один проход все это сделать можно.

Тем паче, эта херня напоминает JSON/BSON (даже больше на CSV смахивает).
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию

Последний раз редактировалось M.A.D.M.A.N., 13.09.2013 в 19:19.
Ответить с цитированием
Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение:
Uniq! (13.09.2013)
  #11  
Старый 13.09.2013, 18:48
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию

Да, кстати, а что за файл?
Откуда он берётся?
Ответить с цитированием
  #12  
Старый 13.09.2013, 19:01
Elza Elza вне форума
Новичок
 
Регистрация: 14.05.2011
Сообщения: 57
Репутация: 10
По умолчанию

ну вот переделала с pos на ваш RegExp
А толку нету, все равно не могу понять, как после разделителя получить с других и заполнить колонки listview-а
Код:
 var
 RegExp:TRegExpr;
 ItData : TListItem;
 begin
  RegExp:=TRegExpr.Create;
  RegExp.Expression:='"date": "(.*?)"';
  if RegExp.Exec(RichEdit1.text) then begin
    repeat
    ItData := ListView1.Items.Add;
    ItData.Caption := RegExp.Match[1];
    until not RegExp.ExecNext; 
  end;
end;

упс не заметила, что ответ есть, сейчас гляну

Последний раз редактировалось M.A.D.M.A.N., 13.09.2013 в 19:17.
Ответить с цитированием
  #13  
Старый 13.09.2013, 19:23
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Вот по автоматам:
http://www.codenet.ru/progr/other/prbook/gl5.php
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #14  
Старый 13.09.2013, 19:46
Elza Elza вне форума
Новичок
 
Регистрация: 14.05.2011
Сообщения: 57
Репутация: 10
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
Вот по автоматам:
http://www.codenet.ru/progr/other/prbook/gl5.php

Вот блин... оладушек... тут совсем не понятно( сдаюсь
Ответить с цитированием
  #15  
Старый 13.09.2013, 20:18
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию

У вас круглые скобки являются оператором "выноса" из твоей строки "значений".
Т.е. если тебе нужно второе значение, возьми его в скобки круглые.

= '"date": "(.*?)" ещё какие-то символы (.*?) ещё символы'
Дайте реальный пример строки:
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 10:13.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025