Форум: "Основная";
Текущий архив: 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