Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.09.27;
Скачать: CL | DM;

Вниз

Парсинг текстового документа и преобразование его в Excel   Найти похожие ветки 

 
Kiminchua   (2009-07-20 13:07) [0]

Здравствуйте.
Мне нужна ваша компетентная помощь в таком вопросе. Хочеться понять как со строками работать, чтобы по конкретному номеру 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;


 
Anatoly Podgoretsky ©   (2009-07-20 13:15) [1]

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

А вопрос?


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


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


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


 
clickmaker ©   (2009-07-20 13:22) [3]

зачем 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] ?


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


> А вопрос?

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

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

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

> ActiveSheet.Cells[3, index]

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


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


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


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


 
clickmaker ©   (2009-07-20 14:17) [6]

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

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


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

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


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


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

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


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

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

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


 
Anatoly Podgoretsky ©   (2009-07-20 15:49) [10]


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

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


 
clickmaker ©   (2009-07-20 16:24) [11]

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

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


 
Anatoly Podgoretsky ©   (2009-07-20 16:40) [12]

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

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


 
Anatoly Podgoretsky ©   (2009-07-20 16:40) [13]

ReadLn


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

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

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. А вместе у меня подвисает программа. Помогите разобраться в проблеме.


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


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


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


 
Kiminchua   (2009-07-22 09:09) [16]

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


 
Kiminchua   (2009-07-22 09:09) [17]

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



Страницы: 1 вся ветка

Текущий архив: 2009.09.27;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.014 c
1-1217416338
hawkins
2008-07-30 15:12
2009.09.27
Настройка окна Structure в среде Delphi2007


1-1216348789
dreamse
2008-07-18 06:39
2009.09.27
Вопрос по ExcelXP


1-1216368170
Zhekson
2008-07-18 12:02
2009.09.27
Как в InputBox_е изменить шрифт ???


2-1248427186
Бонд444
2009-07-24 13:19
2009.09.27
Напомните функцию.


15-1248773497
Someone
2009-07-28 13:31
2009.09.27
Как записать комманду в реестре, для передачи имени проге