Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.04.25;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.127 c
14-1080754744
Knight
2004-03-31 21:39
2004.04.25
Бесплатно-приличная прога для рисования печатей?


3-1080229156
Nemra
2004-03-25 18:39
2004.04.25
Откат глухих блокировок


4-1077104602
sherminator
2004-02-18 14:43
2004.04.25
чекиты в главном меню


1-1081315885
Yuri_Smith
2004-04-07 09:31
2004.04.25
нажатие мыши


4-1077858382
sapsi
2004-02-27 08:06
2004.04.25
Сообщение при минимизации окна





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский