Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.25;
Скачать: CL | DM;

Вниз

Количество строк в текстовом файле...   Найти похожие ветки 

 
Leech   (2004-04-05 17:51) [0]

Интересно, могу я как-то узнать количество строк в текстовом файле? В смысле не торчать в цикле "while not EOF(File1) do" и в нем считывать по строке и увеличивать счетчик, а сразу, без циклов?


 
Тимохов ©   (2004-04-05 17:59) [1]

судя по всему, вы ответ уже знаете - перебор.


 
Fay ©   (2004-04-05 18:01) [2]

73.7


 
Ega23 ©   (2004-04-05 18:06) [3]

Если тебе лень прописывать AssignFile, Reset, While not EOF, CloseFile, то можешь сделать так:
var
List:TStringList;

begin
List:=TStringList.Create;
List.LoadFromFile(твой FileName);

После этого количество строк будет равно List.Count

end;


 
Leech   (2004-04-05 18:15) [4]

Дело в том, что я хотел уйти от переборов... много времени... вот у меня в файле несколько десятков тысяч строк... происходит обработка каждой строки, что отнимает немало времени... а если я еще сначала буду подсчитывать кол-во строк, а потом их обрабатывать... хотел привязать текущую строку к прогрессбару... просто выводить номер текущей строки - не стильно :)


 
Тимохов ©   (2004-04-05 18:17) [5]

перебор: либо сами делайте, либо за вас это сделает кто-то другой, например stringlist.


 
Leech   (2004-04-05 18:19) [6]

да... жаль... уж лучше сам... скорость ещё будет снижаться на передачу в стинглист....  Кстати, а никто не проверял, может быстрее в стинглист прогрузить?


 
Serginio666   (2004-04-05 18:21) [7]

Да уж десятки тысяч строк это много.
http://www.1c.hippo.ru/cgi-bin/predownl.cgi?id=2019
Правда на откэшированном файле 159 МБ меньше 2 секунд.
Аналог StringReplace на 11 мб 230 тыс замен менее 0.1 сек.


 
Ega23 ©   (2004-04-05 18:21) [8]

Ну так вот и проверь!  :о) Потом всем расскажешь.


 
Serginio666   (2004-04-05 18:38) [9]

Уже проверено в [7] там как раз тесты чтения различными способами. Лучше не использовать для таких вещей TStringList.


 
Ega23 ©   (2004-04-05 18:41) [10]

Serginio666   (05.04.04 18:38) [9]

С листом - 3 строчки кода. Без - 10. Хотя без - правильнее.


 
PVOzerski ©   (2004-04-05 18:44) [11]

Вот еще вариант: выделить буфер, открыть файл как нетипизированный и до EOF: считывать блок через BlockRead, считать в нем кол-во #13#10, снова считывать. Потом еще прибавить единицу. Возможно, получится быстрее, чем построчное считывание.


 
Leech   (2004-04-05 18:46) [12]

Хе.. у прогрессбара проперти MAX типа integer... малова-то будет....


 
PVOzerski ©   (2004-04-05 18:50) [13]

>Хе.. у прогрессбара проперти MAX типа integer... малова-то будет....
Во-первых, integer в Win32 - это не так уж мало. Во-вторых, а кто заставляет увеличивать position по чтению каждого (а не каждого 10-го) блока?


 
Leech   (2004-04-05 18:51) [14]

о.. гоню... сенкс...


 
Anatoly Podgoretsky ©   (2004-04-05 18:51) [15]

Leech   (05.04.04 18:15) [4]
А не надо привязываться к количеству строк, есть виличина которая известна без пересчета - это размер файла.

Leech   (05.04.04 18:46) [12]
2 миллиарда маловато? Столько строк у тебя вряд ли когда либо будет


 
Serginio666   (2004-04-05 18:53) [16]

3-4 против 7. Но выигрышь на больших файлах весьма ощютим.

procedure TForm1.Button1Click(Sender: TObject);
Var s:TStringList;
    TR:TTextReader;
     i:Integer;
   begin
If OpenDialog1.Execute Then
Begin

//=======================================
s:=TStringList.Create;
//  s.Capacity:=10000001; // Желательно использовать при известномколичестве строк

S.LoadFromFile(OpenDialog1.FileName);

i:=S.Count;
//======================
TR:=TTextReader.Create(OpenDialog1.FileName);
i:=0;

 While Not TR.Eof do
 Begin

 Tr.Readln;

  Inc(i);
 end;
//============================================


 
Anatoly Podgoretsky ©   (2004-04-05 19:00) [17]

А кто просил объект, ты протестируй тоже самое без TR


 
Serginio666   (2004-04-05 19:08) [18]

А с TR оказывается быстрее так больше используется кэш процессора.

If OpenDialog1.Execute Then
Begin
i:=0;
      f:=TFileStream.Create(OpenDialog1.FileName,fmOpenRead or fmShareDenyWrite  );
       SetLength(ArByte,f.Size);
         f.Read(ArByte[0],length(ArByte));
     P := Pointer(@ArByte[0]);
     if P <> nil then
     while P^ <> #0 do
     begin
       Start := P;
       while not (P^ in [ #0, #10, #13]) do Inc(P);
       inc(i);
         if P^ = #13 then Inc(P);
       if P^ = #10 then Inc(P);
     end;
 end;



Страницы: 1 вся ветка

Текущий архив: 2004.04.25;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.024 c
3-1080287554
stelius
2004-03-26 10:52
2004.04.25
Как определить принадлежность поля к таблице?


8-1074632807
Hawk
2004-01-21 00:06
2004.04.25
Постепенное наращивание качества при передачи изображения


3-1080038819
onix
2004-03-23 13:46
2004.04.25
Безопасность БД


11-1064815249
bfg1000ke
2003-09-29 10:00
2004.04.25
Реестр


1-1081425345
DL
2004-04-08 15:55
2004.04.25
Цветной текст