Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Парсинг текстового документа и преобразование его в Excel [D7, WinXP]


Kiminchua ©   (2009-07-20 13:07:00) 

Здравствуйте.
Мне нужна ваша компетентная помощь в таком вопросе. Хочеться понять как со строками работать, чтобы по конкретному номеру ID читалась следующая за ним строка начиная от Р48= и помещалась в подготовленный Excel-шаблон. Таких строк может быть очень много. Помогите пожалуйста. Буду рад любой помощи.

Пример текстового файла:
09/07/06 07:02:11 дЁ«Ё « ЋЂЋ "ђгбѓЁ¤а®"-"‡ Ј®абЄ п ѓЂќ‘"

< REC=POINT; ID=1ZG**022001; TIME=0; LTIME=1; KTR=1; >
<REC=DAY;DATE=090705; P48=595.516320,604.104480,598.268160,875.145600,968.405760,942.883200,639.515520;
< REC=POINT; ID=1ZG**022005; TIME=0; LTIME=1; KTR=1; >
< REC=DAY; DATE=090705; P48=26.853120,16.238880,13.456800,0.272160,0.000000,0.090720,270.406080,1017.515 520;

Есть код который делает парсинг и заганяет все в один столбик, а мне необходимо от 2 до n колличества, так как строк может быть до сотни.


AssignFile(f, 'd:\1.txt');
 {$I-}
 Reset(f); // открыть для чтения
 {$I+}
 while not EOF(f) do
 begin
   readln(f, buf); // прочитать строку из файла
   strNum:='';
   index:=3;
    if pos('P48', buf) >0 then
         begin
            for i:=pos('P48',buf)+4 to Length(buf) do
               begin
                 if (buf[i]<>',') and (buf[i]<>';') then strnum:=strnum+buf[i] else
                   begin
                     XLApp.ActiveWorkBook.ActiveSheet.Cells[index,3]:=strnum;
                     strnum:='';
                     inc(index);
                   end;
                 if buf[i]=';' then Break;
               end;


Kiminchua   (2009-07-22 09:09:00) [1]

Удалено модератором


Kiminchua   (2009-07-22 09:09:00) [2]

Всем спасибо все получилось.


Сергей М.   (2009-07-20 21:43:00) [3]


>  If sID='1ZG**022001' Then
>     begin
>      for i:=pos('P48',buf)+4 to Length(buf) do


Откуда же в строке, содержащей ID, возьмется P48 ?
Оно же в следующейстроке !


Kiminchua   (2009-07-20 21:21:00) [4]

Проделал следующие действия:

AssignFile(f, 'c:\ZAGG0706.001');
 {$I-}
 Reset(f); // открыть для чтения
 {$I+}

 while not EOF(f) do
 begin
   readln(f, buf, s1); // прочитать строку из файла
   Index1:=Pos(#32'ID=',S1)+3;
   Index2:=PosEx(';',S1,Index1-1);
   sID:=Copy(S1,Index1,Index2-Index1+1);
   strNum:='';
   If sID='1ZG**022001' Then
    begin
     for i:=pos('P48',buf)+4 to Length(buf) do
      begin
       if (buf[i]<>',') and (buf[i]<>';') then strnum:=strnum+buf[i] else
        begin
         Memo1.Lines.Add(strnum);
         strnum:='';
         inc(index);
        end;
        if buf[i]=';' then Break;
      end;

Не могу найти ошибку. По очередно могу вывести в поле Memo ID и P48. А вместе у меня подвисает программа. Помогите разобраться в проблеме.


Anatoly Podgoretsky   (2009-07-20 16:40:00) [5]

ReadLn


Anatoly Podgoretsky   (2009-07-20 16:40:00) [6]

> clickmaker  (20.07.2009 16:24:11)  [11]

Для текстовых файлов об этом не приходит беспокоиться WriteLN читает до символов перевода строки включительно.


clickmaker   (2009-07-20 16:24:00) [7]

> удобней работать со StringList?

удобней находить следующую строку. по индексу.
если же файл читаешь по ходу, то придется читать с запасом и искать символы перевода строки или Р48=.


Anatoly Podgoretsky   (2009-07-20 15:49:00) [8]


> ты думаешь будет удобней работать со StringList?

Трудно сказать, но не хуже обычного прохода по файлу, разница, в том, что весь текст сразу загружается в список, а дальше разницы нет.


Anatoly Podgoretsky   (2009-07-20 15:47:00) [9]

Если более 3 листов, значит много воды.
Вот ссылка, если выкинут воду, то как раз 2/2 страницы и останутся

http://www.podgoretsky.com/Redir.aspx?id=143&DownloadFile=~/ddp/PasFiles.aspx


Kiminchua   (2009-07-20 15:46:00) [10]


> лучше файл прочитать в StringList и там уже искать

ты думаешь будет удобней работать со StringList?


Kiminchua   (2009-07-20 15:16:00) [11]

А есть хорошие книги по работе с текстовыми документами в Delphi, не маленькие на два три листочка, а нормальные листов на 100?


clickmaker   (2009-07-20 14:17:00) [12]

> Хочу узнать как это сделать

лучше файл прочитать в StringList и там уже искать


Сергей М.   (2009-07-20 14:11:00) [13]


> Хочу узнать как это сделать


Точно так же как и обнаружение P48


Kiminchua   (2009-07-20 14:07:00) [14]


> А вопрос?

Как по номеру ID читать нужную строку (следующую за строкой с ID) и добавлять ее в определенные столбцы Excel'я?

> И где в твоем коде фигурирует обнаружение этого самого "конкретного
> номера ID" ?

Хочу узнать как это сделать.

> ActiveSheet.Cells[3, index]

Если я пойму как по номеру ID читать строку, я сделаю цикл для добавления в остальные столбцы Excel. Пока получается загнать только в один столбец.


clickmaker   (2009-07-20 13:22:00) [15]

зачем 2 раза вычислять pos?
for i:=pos('P48',buf)+4

p := pos('P48', buf);
if (p > 0) then begin
 Inc(p, 4);
 for i := p to ...

> заганяет все в один столбик, а мне необходимо от 2 до n
> колличества

ActiveSheet.Cells[3, index] ?


Сергей М.   (2009-07-20 13:17:00) [16]


> чтобы по конкретному номеру ID


И где в твоем коде фигурирует обнаружение этого самого "конкретного номера ID" ?
Что-то не видать ничего похожего..


Anatoly Podgoretsky   (2009-07-20 13:15:00) [17]

> Kiminchua  (20.07.2009 13:07:00)  [0]

А вопрос?


Наверх

Титульная страница Поиск, карта сайта Написать письмо