![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как сделать ф-цию парсинга [D7, XP]
Виталий80 © (2005-11-12 22:36:00)Добрый вечер!
Подскажите как сделать функцию парсинга и как избавиться от ограничения ???, а перемещаться по строке до, например # или запятой
procedure TForm1.Button2Click(Sender: TObject);
var
FName: textfile;
s: string[17];//как избавиться от ограничения ???, а перемещаться по строке до, например # или запятой
s1: string[27];
s2: string[17];
s3: string[60];
s4: string[7];
s5: string[10];
item: Tlistitem;
begin
AssignFile(FName,'log.txt');
Reset(FName);
try
while not Eof(FName) do
begin
Readln(FName, s, s1, s2, s3, s4, s5);
item:= ListView1.items.add;
item.caption:= s;
item.SubItems.Add(s1);
item.SubItems.Add(s2);
item.SubItems.Add(s3);
item.SubItems.Add(s4);
item.SubItems.Add(s5);
end;
finally
closefile(FName);
end;
end;
gdaujk (2005-11-14 07:56:00) [1]Virgo_Style © (13.11.05 20:21) [15]
Он просто понял, что мы зашли в тупик и ничего дельного подсказать уже не можем. Далее он будет действовать сам !!!
PS: хватит стебеться :-))))))))
PS 2: а чё "Орешник" не работает ? :-))))
Джо (2005-11-13 20:25:00) [2]
> [15] Virgo_Style © (13.11.05 20:21)
Не думаю, что были сделаны выводы. Скоро появится 3-я ветка с идентичным вопросом.
Капля камень точит или - I'll be back :^)
Virgo_Style (2005-11-13 20:21:00) [3]Виталий80 (13.11.05 19:38) [14]
Все отлично я понял, это тупик!
О, молодец, мало кто понимает, что "напишите мне программу" - это тупиковый путь. Уважаю.
:-)
Виталий80 (2005-11-13 19:38:00) [4]А как же пиво!
>> gdaujk ©
>Дело не в структуре. Модифицируй Parsing.
>PS: хочешь сделать что-нибудь хорошо - сделай это сам!
Все отлично я понял, это тупик!
gdaujk (2005-11-13 18:02:00) [5]Виталий80 (13.11.05 17:37) [12]
Дело не в структуре. Модифицируй Parsing.
PS: хочешь сделать что-нибудь хорошо - сделай это сам!
Виталий80 (2005-11-13 17:37:00) [6]Все разобрался, но есть еще вопросик:
считавание происходит только в первый столбец Listview!?
а как с другими столбцами, а может все дело в формировании файла?
Подскажите!
у меня
title1#title2#title3
Виталий80 (2005-11-13 17:14:00) [7]Выдает:
Types of actual and formal var parameters must be identical
Где проблема-то голову уже сломал
gdaujk (2005-11-13 16:57:00) [8]
function Parsing(Value: PChar; Sep: Char; Res: TListItems): Integer;
var
Str: string;
Item: TListItem;
procedure AddToRes();
begin
Item := Res.Add;
Item.Caption := Str;
Result := Result + 1;
end;
begin
while Value^ <> #0 do begin
if Value^ = Sep then
begin
AddToRes;
Str := '';
Inc(Value);
end;
Str := Str + Value^;
Inc(Value);
end;
if Str <> #0 then AddToRes;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Buf: array of Char;
F: THandle;
Size: DWORD;
begin
F := CreateFile(PChar('C:\TextFile.txt'), GENERIC_READ, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if F = INVALID_HANDLE_VALUE then Exit;
Size := GetFileSize(F, nil);
if (Size = $FFFFFFFF) or (Size = 0) then Exit;
GetMem(Buf, Size);
if not ReadFile(F, Buf[0], Size, Size, nil) then Exit;
Parsing(@Buf[0], '#', ListView1.Items);
FreeMem(Buf);
FileClose(F);
end;
С тебя пиво...
Виталий80 (2005-11-13 14:29:00) [9]procedure TForm1.Button1Click(Sender: TObject);
var
f: TextFile;
fname: string;
str:string;
i: integer;
item: Tlistitem;
begin
fname:='news.txt';
assignfile(f, fname);
{$I-}
reset(f);
{$I+}
while not Eof(f) do
begin
Readln(f, str);
item:= ListView1.items.add;
item.caption:= str;
item.SubItems.Add(copy(str,1,pos('#', str)-1));
end;
closefile(f)
end;
Как мне применить Parsing('Строка#из#файла', '#', TstrL)
gdaujk (2005-11-13 09:44:00) [10]Первое, что пришло в голову:
function Parsing(Value: PChar; Sep: Char; var Res: TStrings): Integer;
var
Str: string;
procedure AddToRes();
begin
Res.Add(Str);
Result := Result + 1;
end;
begin
Res := TStringList.Create;
while Value^ <> #0 do begin
if Value^ = Sep then
begin
AddToRes;
Str := '';
Inc(Value);
end;
Str := Str + Value^;
Inc(Value);
end;
if Str <> #0 then AddToRes;
end;
Пользоваться так:
var
TstrL: TStrings;
...
Parsing('Строка#из#файла', '#', TstrL);
Virgo_Style (2005-11-13 08:12:00) [11]Виталий80 (13.11.05 7:07) [6]
считываеться только в файле до первого знака #,
Не верю (c), уж считывается-то точно все.
Ты не добавляешь остаток строки после "#" - это раз.
Никак не проверяется, есть ли этот символ вообще - это два.
Виталий80 (13.11.05 7:07) [6]
где функция то сама и как ей пользоваться.
Какая?
Виталий80 (2005-11-13 07:07:00) [12]Да было ну и что из указанного
Пусть есть текстовый файл D:\1.txt, тогда обработчик может иметь вид:
var
f: TextFile;
fname: string;
ch: char;
str:string;
i: integer;
begin
fname:='D:\1.txt';
assignfile(f, fname);
{$I-}
reset(f);
{$I+}
while not Eof(f) do
begin
Readln(f, str);
memo1.Lines.Add(copy(str,1,pos('#', str)-1));
label1.Caption:=label1.Caption+' '+inttostr(pos(str, ','));
end;
closefile(f)
end;
считываеться только в файле до первого знака #, а как продолжить-то не понятно, где функция то сама и как ей пользоваться.
Вообще не работает процесс мне совершенно не понятно.
>Джо ©
>gdaujk ©
В топике форума написано быть снисходительными, но видимо это не для вас
gdaujk (2005-11-13 06:15:00) [13]Zeqfreed © (12.11.05 23:21) [2]
Вот тема была от этого же имени, с этим же содержимым:
А ему понравилось :-)
PS: Повторение - мать заикания...
Джо (2005-11-13 01:13:00) [14]Он ушел, но обещал вернуться (с) Малыш и Карлсон.
Джо (2005-11-13 01:12:00) [15]Забавно-с :)
Zeqfreed (2005-11-12 23:21:00) [16]Виталий80 (12.11.05 22:36)
Ты издеваешься? Не смешно.
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1129920999&n=18
Вот тема была от этого же имени, с этим же содержимым:
Виталий00 © (21.10.05 22:56)
Здравствуйте!
Как избавиться от ограничения ???,
а перемещаться по строке до, например # или запятой
procedure TForm1.Button2Click(Sender: TObject);
var
FName: textfile;
s: string[17];//как избавиться от ограничения ???, а перемещаться по строке до, например # или запятой
s1: string[27];
s2: string[17];
s3: string[60];
s4: string[7];
s5: string[10];
item: Tlistitem;
begin
AssignFile(FName,'log.txt');
Reset(FName);
try
while not Eof(FName) do
begin
Readln(FName, s, s1, s2, s3, s4, s5);
item:= ListView1.items.add;
item.caption:= s;
item.SubItems.Add(s1);
item.SubItems.Add(s2);
item.SubItems.Add(s3);
item.SubItems.Add(s4);
item.SubItems.Add(s5);
end;
finally
closefile(FName);
end;
end;
-----------------------------------------------------------
Zeqfreed © (21.10.05 23:09) [1]
Виталий00 © (21.10.05 22:56)
Мягко говоря, ...
В общем, сформулируй свой вопрос по-корректней.
Какое такое ограничение? И чем оно тебе мешает?
-----------------------------------------------------------
Виталий00 © (21.10.05 23:16) [2]
У меня прописано ограничение строки, к примеру string[12], что означает что я беру строку в 12 знаков, но как сделать чтобы брать количество знаков из текстового файла например до знака "#" или запятой, т.е. конкретно не прописывать, это будет определено текстом в строке, может это будет 20 знаков!?
-----------------------------------------------------------
Виталий00
-----------------------------------------------------------
У меня прописано ограничение строки, к примеру string[12], что означает что я беру строку в 12 знаков, но как сделать чтобы брать количество знаков из текстового файла например до знака "#" или запятой, т.е. конкретно не прописывать, это будет определено текстом в строке, может это будет 20 знаков!?
Zeqfreed © (21.10.05 23:22) [3]
Виталий00 © (21.10.05 23:16) [2]
Ну, я бы выбрал такой вариант: читать всю строку и делать парсинг (разбор строки на необходимые части).
Напрямую то, что ты хочешь реализовать нельзя.
-----------------------------------------------------------
Виталий00 © (21.10.05 23:29) [4]
Хорошо, но как это сделать? Есть ли примеры?
-----------------------------------------------------------
Виталий00
-----------------------------------------------------------
Хорошо, но как это сделать? Есть ли примеры?
Zeqfreed © (22.10.05 0:25) [5]
Виталий00 © (21.10.05 23:29) [4]
Можно использовать готовые решения, например, регулярные выражения. Или самому писать ф-цию парсинга, например, основываясь на теорию конечных автоматов или, так сказать, "в лоб" если исходные данные имеют простой формат. Опиши свою задачу более детально.
-----------------------------------------------------------
irishka001 © (22.10.05 1:00) [6]
Пусть есть текстовый файл D:\1.txt, тогда обработчик может иметь вид:
var
f: TextFile;
fname: string;
ch: char;
str:string;
i: integer;
begin
fname:='D:\1.txt';
assignfile(f, fname);
{$I-}
reset(f);
{$I+}
while not Eof(f) do
begin
Readln(f, str);
memo1.Lines.Add(copy(str,1,pos('#', str)-1));
label1.Caption:=label1.Caption+' '+inttostr(pos(str, ','));
end;
closefile(f)
end;
-----------------------------------------------------------
Виталий00
-----------------------------------------------------------
У меня прописано ограничение строки, к примеру string[12], что означает что я беру строку в 12 знаков, но как сделать чтобы брать количество знаков из текстового файла например до знака "#" или запятой, т.е. конкретно не прописывать, это будет определено текстом в строке, может это будет 20 знаков!?
Германн © (22.10.05 2:26) [7]
2 Виталий00 © (21.10.05 23:16) [2]
Могу ошибаться, но, имхо, если разделителем поставить запятую или "табуляцию", то Readln - нормально всё прочитает.
-----------------------------------------------------------
Anatoly Podgoretsky © (22.10.05 13:17) [8]
Вот это совсем не рабочее Readln(FName, s, s1, s2, s3, s4, s5);, можно только так Readln(FName, AnsiString); и далее парсинг
Джо (2005-11-12 22:44:00) [17]
> и как избавиться от ограничения ???,
А теперь подробней - кто кого и в чем ограничивает.