Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
14-1131565515
бабба
2005-11-09 22:45
2005.12.04
Помогите с архитектурным решением


3-1129801845
Карелин Артем
2005-10-20 13:50
2005.12.04
Как выполнить скрипт в ADO из нескольких команд?


10-1108636552
Swimmer
2005-02-17 13:35
2005.12.04
Так стоит использовать CORBA


2-1131937168
homm
2005-11-14 05:59
2005.12.04
Размер


1-1131190336
_Sergey_
2005-11-05 14:32
2005.12.04
Удаление выделенных узлов TreeView