![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Парсинг текстового документа и преобразование его в 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]
А вопрос?