Текущий архив: 2005.12.04;
Скачать: CL | DM;
Вниз
Как сделать ф-цию парсинга Найти похожие ветки
← →
Виталий80 (2005-11-12 22:36) [0]Добрый вечер!
Подскажите как сделать функцию парсинга и как избавиться от ограничения ???, а перемещаться по строке до, например # или запятой
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;
← →
Джо © (2005-11-12 22:44) [1]
> и как избавиться от ограничения ???,
А теперь подробней - кто кого и в чем ограничивает.
← →
Zeqfreed © (2005-11-12 23:21) [2]Виталий80 (12.11.05 22:36)
Ты издеваешься? Не смешно.
http://delphimaster.net/view/2-1129920999/
Вот тема была от этого же имени, с этим же содержимым:
Виталий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-13 01:12) [3]Забавно-с :)
← →
Джо © (2005-11-13 01:13) [4]Он ушел, но обещал вернуться (с) Малыш и Карлсон.
← →
gdaujk © (2005-11-13 06:15) [5]Zeqfreed © (12.11.05 23:21) [2]
Вот тема была от этого же имени, с этим же содержимым:
А ему понравилось :-)
PS: Повторение - мать заикания...
← →
Виталий80 (2005-11-13 07:07) [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;
считываеться только в файле до первого знака #, а как продолжить-то не понятно, где функция то сама и как ей пользоваться.
Вообще не работает процесс мне совершенно не понятно.
>Джо ©
>gdaujk ©
В топике форума написано быть снисходительными, но видимо это не для вас
← →
Virgo_Style © (2005-11-13 08:12) [7]Виталий80 (13.11.05 7:07) [6]
считываеться только в файле до первого знака #,
Не верю (c), уж считывается-то точно все.
Ты не добавляешь остаток строки после "#" - это раз.
Никак не проверяется, есть ли этот символ вообще - это два.
Виталий80 (13.11.05 7:07) [6]
где функция то сама и как ей пользоваться.
Какая?
← →
gdaujk © (2005-11-13 09:44) [8]Первое, что пришло в голову:
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);
← →
Виталий80 (2005-11-13 14:29) [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 16:57) [10]
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 17:14) [11]Выдает:
Types of actual and formal var parameters must be identical
Где проблема-то голову уже сломал
← →
Виталий80 (2005-11-13 17:37) [12]Все разобрался, но есть еще вопросик:
считавание происходит только в первый столбец Listview!?
а как с другими столбцами, а может все дело в формировании файла?
Подскажите!
у меня
title1#title2#title3
← →
gdaujk © (2005-11-13 18:02) [13]Виталий80 (13.11.05 17:37) [12]
Дело не в структуре. Модифицируй Parsing.
PS: хочешь сделать что-нибудь хорошо - сделай это сам!
← →
Виталий80 (2005-11-13 19:38) [14]А как же пиво!
>> gdaujk ©
>Дело не в структуре. Модифицируй Parsing.
>PS: хочешь сделать что-нибудь хорошо - сделай это сам!
Все отлично я понял, это тупик!
← →
Virgo_Style © (2005-11-13 20:21) [15]Виталий80 (13.11.05 19:38) [14]
Все отлично я понял, это тупик!
О, молодец, мало кто понимает, что "напишите мне программу" - это тупиковый путь. Уважаю.
:-)
← →
Джо © (2005-11-13 20:25) [16]
> [15] Virgo_Style © (13.11.05 20:21)
Не думаю, что были сделаны выводы. Скоро появится 3-я ветка с идентичным вопросом.
Капля камень точит или - I"ll be back :^)
← →
gdaujk © (2005-11-14 07:56) [17]Virgo_Style © (13.11.05 20:21) [15]
Он просто понял, что мы зашли в тупик и ничего дельного подсказать уже не можем. Далее он будет действовать сам !!!
PS: хватит стебеться :-))))))))
PS 2: а чё "Орешник" не работает ? :-))))
Страницы: 1 вся ветка
Текущий архив: 2005.12.04;
Скачать: CL | DM;
Память: 0.53 MB
Время: 0.079 c