Текущий архив: 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