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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 22.03.2011, 15:37
aktivizion aktivizion вне форума
Прохожий
 
Регистрация: 05.07.2010
Сообщения: 8
Репутация: 10
По умолчанию парсинг/загрузка из структурированного txt файла

Привет всем.
Очень долго мучаюсь с проблемой парсинга (структурированного).

Пример:
Дан файл txt с содержимым:
Код:
1. Наиболее полное толкование понятия техника это …
а) совокупность средств, создаваемых для осуществления процесса производства и обслуживания потребностей общества
b) комплекс материальных вещей, средств и орудий труда
с) совокупность орудий труда и навыков
d) реализация человеческого разума
 2. Машиной  называется …
а) устройство, предназначенное для осуществления механических движений и силовых воздействий, необходимых для выполнения  рабочих процессов 
b) устройство, представляющее собой совокупность механизмов одного функционального назначения
c) устройство, выполняющее механическое движение
d) устройство, состоящее из нескольких механизмов
....

Как лучше парсить данные:

Номер вопроса, вопрос, ответ а, ответ б, ответ с, ответ д;

нужно использовать записи?
или же массивы?

могли бы показать небольшой пример?

1) Если учесть что может быть перенос строк.
2) Или же вариантов ответа не 4-ыре, а 5-ть (a,b,c,d,e).

(Просто нужно будет после чтения отправлять данные на сервер методом post )

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

Если каждое значение в отдельной строке, то загоняем ваш файл в StringList
Затем проверяем последовательно строки на наличие цифры + точка в начале, это будет вопрос. Далее по той-же схеме проверяем уже букву + скобку в начале пока не достигнем следующего номера или конца файла.
Если-же перенос строк, то уже несколько сложнее. Можно считать, что строка является продолжением предыдущей если начинается не с цифры + точка и не с буквы + скобка.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 22.03.2011, 15:52
aktivizion aktivizion вне форума
Прохожий
 
Регистрация: 05.07.2010
Сообщения: 8
Репутация: 10
По умолчанию

Цитата:
Сообщение от Страдалецъ
Если каждое значение в отдельной строке, то загоняем ваш файл в StringList
Затем проверяем последовательно строки на наличие цифры + точка в начале, это будет вопрос. Далее по той-же схеме проверяем уже букву + скобку в начале пока не достигнем следующего номера или конца файла.
Если-же перенос строк, то уже несколько сложнее. Можно считать, что строка является продолжением предыдущей если начинается не с цифры + точка и не с буквы + скобка.

Я канешно так и думал что должно быть, спасибо за ответ.
Но немоглибы подкинуть пример?
или ткнуть носом, возможно ктото уже задавался подобным вопросом.
просто я не нашел.
Ответить с цитированием
  #4  
Старый 22.03.2011, 16:25
Janom Janom вне форума
Начинающий
 
Регистрация: 04.02.2011
Адрес: Москва
Сообщения: 148
Версия Delphi: 7
Репутация: 133
По умолчанию

Цитата:
Сообщение от aktivizion
Я канешно так и думал что должно быть, спасибо за ответ.
Но немоглибы подкинуть пример?
или ткнуть носом, возможно ктото уже задавался подобным вопросом.
просто я не нашел.
Исходник любого теста... Их полно...
Ответить с цитированием
  #5  
Старый 22.03.2011, 16:30
aktivizion aktivizion вне форума
Прохожий
 
Регистрация: 05.07.2010
Сообщения: 8
Репутация: 10
По умолчанию

Цитата:
Сообщение от Janom
Исходник любого теста... Их полно...

Я канешно не собираюсь спорить, но вот честно не нашел то что нужно мне
Хотя за наводки спасибо

Последний раз редактировалось aktivizion, 22.03.2011 в 16:32.
Ответить с цитированием
  #6  
Старый 22.03.2011, 16:56
Janom Janom вне форума
Начинающий
 
Регистрация: 04.02.2011
Адрес: Москва
Сообщения: 148
Версия Delphi: 7
Репутация: 133
По умолчанию

Исходник теста на DelphiSources
Ответить с цитированием
  #7  
Старый 22.03.2011, 16:59
aktivizion aktivizion вне форума
Прохожий
 
Регистрация: 05.07.2010
Сообщения: 8
Репутация: 10
По умолчанию

Цитата:
Сообщение от Janom


Да да, это я уже нашел , приду с работы буду разбираться
Ответить с цитированием
  #8  
Старый 22.03.2011, 22:09
aktivizion aktivizion вне форума
Прохожий
 
Регистрация: 05.07.2010
Сообщения: 8
Репутация: 10
По умолчанию

Тема всё ещё актуальна)...
Ответить с цитированием
  #9  
Старый 22.03.2011, 23:20
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию

хм,парсингом вообще не занимался какбы,но есть такая идея,просто проверяешь функцией pos,если строка начинается с цифры,то это вопрос,а ответы ниже это ответы к этому вопросу,вопросы можно каким нить циклом - типа repeat until,или while, до тех пор пока в строке не будет цифра.
извиняюсь если мой вариант не слишком хороший,ибо парсингом текста не занимался)

Последний раз редактировалось Snake22, 22.03.2011 в 23:23.
Ответить с цитированием
  #10  
Старый 22.03.2011, 23:32
aktivizion aktivizion вне форума
Прохожий
 
Регистрация: 05.07.2010
Сообщения: 8
Репутация: 10
По умолчанию

Цитата:
Сообщение от Snake22
хм,парсингом вообще не занимался какбы,но есть такая идея,просто проверяешь функцией pos,если строка начинается с цифры,то это вопрос,а ответы ниже это ответы к этому вопросу,вопросы можно каким нить циклом - типа repeat until,или while, до тех пор пока в строке не будет цифра.
извиняюсь если мой вариант не слишком хороший,ибо парсингом текста не занимался)

Идею подал, спасиб большое, удалось покачто мало-мальски получить номер и вопрос, остольное буду додумывать твоей идеей


Просто моя беда была ещё вот в чем:

У меня был оригинал в ворде, из него я перегнал в текстовик, и сохранил, но сохранил я в юникоде так как выдало предупреждение о том что есть какието символы, а вдруг они в ответе нужны, ну и получилось что я в 7-едьмой дельфи работал, а там стандартно tstringlist неразбирает в какой кодировке.
попробовал на 11 (rad studio xe) заработало

и то что я сказал что заработало, незначит то что вопрос решен) а то что часть от этой массы

Последний раз редактировалось aktivizion, 22.03.2011 в 23:38.
Ответить с цитированием
  #11  
Старый 23.03.2011, 00:01
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Вариант - отказаться от текстового файла и перейти либо на бинарный файл, либо на xml
Ответить с цитированием
  #12  
Старый 23.03.2011, 00:18
aktivizion aktivizion вне форума
Прохожий
 
Регистрация: 05.07.2010
Сообщения: 8
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Вариант - отказаться от текстового файла и перейти либо на бинарный файл, либо на xml

да я бы с радостью бы на бинарный перешел, у меня есть опыт работы там, но, перевод тоже осуществляется парсингом, такчто мне кажется никак не отвертеться
Ответить с цитированием
  #13  
Старый 25.03.2011, 23:36
aktivizion aktivizion вне форума
Прохожий
 
Регистрация: 05.07.2010
Сообщения: 8
Репутация: 10
По умолчанию

Покачто долибся такого:
Код:
var
i:integer;
a,b,c,d:integer;
a1,b1,c1,d1:string;
que,z:string;
s,buf,buf1:string;
begin
readln(f1,s);
label6.Caption:=s;
a:=ansipos('a)',s);
b:=ansipos('b)',s);
c:=ansipos('c)',s);
d:=ansipos('d)',s);

 if (a = 0) and (s[2] <> ')') and (IsNumber(s[1]) = true) then
  begin
   que:=s;
   label1.Caption:=s;
  end;

   if (a <> 0) and (IsNumber(s[1]) = false) then
    begin
     //a1:=Copy(s,a+1,b-a);
     a1:=s;
     label2.Caption:=s;
    end;

     if (b <> 0) and (IsNumber(s[1]) = false) then
      begin
       b1:=s;
       label3.Caption:=s;
      end;

       if (c <> 0) and (IsNumber(s[1]) = false) then
        begin
         c1:=s;
         label4.Caption:=s;
        end;
        
        if (d <> 0) and (IsNumber(s[1]) = false) then
         begin
          d1:=s;
          label5.Caption:=s;
         end;
                    
         if (a <> 0) and (b <> 0) and (c <> 0) and (d <> 0) and (IsNumber(s[1]) = true) then
          begin
           que := Copy(s,1,a-1);
           a1 := Copy(s,a+2,b-a);
           b1 := Copy(s,b+2,c-b);
           c1 := Copy(s,c+2,d-c);
           d1 := Copy(s,d+2,Length(s));
           label1.Caption:=que;
           label2.Caption:=a1;
           label3.Caption:=b1;
           label4.Caption:=c1;
           label5.Caption:=d1;
          end;
end;

может кому пригодится.
Осталось чуть подкорректировать, и по циклу погнать

Код:
function tform1.IsNumber(s: string): Boolean;
var
   i, v: integer;
begin
   Val(s, v, i);
   IsNumber := (i=0);
end;

Последний раз редактировалось aktivizion, 25.03.2011 в 23:39.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter