Главная страница
    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.49 MB
Время: 0.004 c
2-1248246109
DevilDevil
2009-07-22 11:01
2009.09.27
Чтение/запись файла в отдельном потоке


15-1248936484
123123
2009-07-30 10:48
2009.09.27
rsync


15-1248550614
TStas
2009-07-25 23:36
2009.09.27
Как вставить у страниц номера в 2007 Ворде?


4-1218200398
plotnick
2008-08-08 16:59
2009.09.27
Как проверить аккаунт пользователя?


4-1217571568
mistic
2008-08-01 10:19
2009.09.27
непростое контекстное меню





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский