Главная страница
    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.03 c
3-1080038819
onix
2004-03-23 13:46
2004.04.25
Безопасность БД


3-1080720115
DimDim
2004-03-31 12:01
2004.04.25
DBISAM и Win95 несовместимы ??????


7-1077878616
aabout
2004-02-27 13:43
2004.04.25
Программное переключение клавы


14-1081071766
uw
2004-04-04 13:42
2004.04.25
Наука утверждает...


3-1080151731
Doctor Deejay
2004-03-24 21:08
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский