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

Вниз

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

 
FANAT ©   (2005-05-30 07:17) [0]

Или такого нет.... или я забыл....
как подсчитать количество строк в текстовом файле и взять предпоследнюю строку?


 
Rep ©   (2005-05-30 07:30) [1]

Например так:
Var
SL:TSringList;
...

SL.LoadFromFile("sdsdsds.txt");
STR:=SL[SL.Count-2];


 
Alx2 ©   (2005-05-30 07:32) [2]

FANAT ©   (30.05.05 7:17)
Var F : System.Text;
   Prev_S, S : String;
   l_Count : Integer;
begin
AssignFile(F,FileName);
Reset(F);
try
 l_Count :=0;
 S :="";
 while not eof(F) do
 begin
  Prev_S :=S;
  ReadLn(F,S);
  inc(l_count);
 end;
finally
 closefile(F);
end;
end;


 
TUser ©   (2005-05-30 07:33) [3]

TStringList.LoadFromFile
TStringList.Count
TStringList.Strings


 
TUser ©   (2005-05-30 07:41) [4]

[2] - очень медленный метод


 
Alx2 ©   (2005-05-30 07:42) [5]

>Rep ©   (30.05.05 07:30)
>TUser ©   (30.05.05 07:33)

Вот все мало вам тормозных программ :)


 
Alx2 ©   (2005-05-30 08:31) [6]

TUser ©   (30.05.05 7:41) [4]
Проверил на 700 Mb файле.
Вариант с Readln ~ 35 сек.
Вариант с TstringList не дождался - ждал более 15 мин.

Машина P4 1800 с 512 Mb RAM

На мелочи, действительно, TStringList быстрее на ~20-25% засчет чтения файла "целиком". Но ростом размера файла идет почти экспоненциальный спад производительности, когда места в памяти недостаточно.
И оно надо - все целиком в память?


 
TUser ©   (2005-05-30 08:36) [7]

Чего-то не то проверял. На больших файлах TStringList как раз намного быстрее, а на маленьких файлах - разница практически незаметна


 
Alx2 ©   (2005-05-30 08:42) [8]

TUser ©   (30.05.05 8:36) [7]

Но ведь убедиться самому недолго?


 
Anatoly Podgoretsky ©   (2005-05-30 10:09) [9]

Alx2 ©   (30.05.05 08:31) [6]
Лучше бы ты дождался, тогда наверно удивление было бы еще больше.
Предлагаю провести эксперимент, сделать файлик скажем из одного миллиона строк из одного символа и загрузить в TStringList при этом понаблюдать за расходом памяти. Только на всякий случай запасись валидолом.


 
Alx2 ©   (2005-05-30 10:16) [10]

Anatoly Podgoretsky ©   (30.05.05 10:09) [9]
Нет, Анатолий. Спасибо. Я, возможно, и извращенец кое в чем. Но сие уже выходит за все границы :))


 
TUser ©   (2005-05-30 11:44) [11]

Хм, действительно - убедился в ложности своих убеждений.


 
MBo ©   (2005-05-30 13:27) [12]

маленький вопросик автору ветки - есть ли нужда считать строки?
Если задача состоит только в выделении предпоследней - то этого вообще-то не требуется...


 
KilkennyCat ©   (2005-05-30 13:38) [13]


> [12] MBo ©   (30.05.05 13:27)

Логично. Просто просмотреть файл с конца до нужного перевода. В принципе, и строки сосчитать так будет быстрее. Только не методом ReadLn :))


 
Alx2 ©   (2005-05-30 13:44) [14]

Да. Офигенная проблема...


 
BFG9k ©   (2005-05-30 17:17) [15]


> KilkennyCat ©   (30.05.05 13:38) [13]
>
> Логично. Просто просмотреть файл с конца до нужного перевода.
> В принципе, и строки сосчитать так будет быстрее. Только
> не методом ReadLn :))


Подсчет строк с конца файла по скорости равен (а возможно и медленнее) подсчету с начала. Для того чтобы сосчитать строки, нужно сосчитать ВСЕ символы перевода строк в файле. Для этого так или иначе придется читать файл целиком.


 
KilkennyCat ©   (2005-05-30 18:15) [16]


> [15] BFG9k ©   (30.05.05 17:17)

гениально. я имел ввиду нахождение предпоследней строки.


 
BFG9k ©   (2005-05-30 18:51) [17]

2 KilkennyCat :

> В принципе, и строки сосчитать так будет быстрее


Нет смысла оправдываться :)


 
Anatoly Podgoretsky ©   (2005-05-30 20:01) [18]

BFG9k ©   (30.05.05 18:51) [17]
Правильно, поскольку оправдываться нужно тебе.


 
raidan ©   (2005-05-30 20:38) [19]

Я б его blockread"ом ел и парсил бы на количество #13#10 :)


 
Чапаев ©   (2005-05-30 21:23) [20]

> Я б его blockread"ом ел и парсил бы на количество #13#10 :)
Причём читал бы с конца блоками по 512..8192 байта.


 
raidan ©   (2005-05-30 21:41) [21]

>Чапаев ©   (30.05.05 21:23) [20]
С другой стороны, нужно попробовать read"ом - читать посимвольно :)))
Ща поэкспериментирую...


 
BFG9k ©   (2005-05-30 21:50) [22]


> Anatoly Podgoretsky ©   (30.05.05 20:01) [18]
> BFG9k ©   (30.05.05 18:51) [17]
> Правильно, поскольку оправдываться нужно тебе.


Обойдемся без демагогии. Между "считать" и "сосчитать" есть кое-какая разница.


 
raidan ©   (2005-05-30 22:10) [23]

Не, старый добрый blockread (8192) на слабеньком П3-500 всех уел :)
С четырехкратным превосходством над ReadLn на файлике в 52 метра (строка от 1 до 100 символов рандомом) и двукратным на файлике в 210 метров (строка 19 символов длиной всегда)...


 
BFG9k ©   (2005-05-30 22:17) [24]

radian :

Кажется борланд не рекомендует использовать старые паскалевские функции вроде read, write и т.д. Как насчет FileCreate (или CreateFile , не помню точно) , FileRead и FileWrite ?



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

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

Наверх




Память: 0.52 MB
Время: 0.044 c
3-1115358479
Patrick
2005-05-06 09:47
2005.06.14
Delphi 7 и Oracle 8i


14-1117097701
OX
2005-05-26 12:55
2005.06.14
Может быть, хоть здесь мне помогут...


1-1117207820
Cash
2005-05-27 19:30
2005.06.14
Проблема целесообразности


3-1115474287
eLVik
2005-05-07 17:58
2005.06.14
Отличить ключевое поле от обычного (ADO)


14-1116842750
Petr V. Abramov
2005-05-23 14:05
2005.06.14
Несправедливость!