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

Вниз

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

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

Наверх





Память: 0.49 MB
Время: 0.038 c
14-1117026867
Korvet
2005-05-25 17:14
2005.06.14
Открытие окон в инете.


6-1111948462
livs
2005-03-27 22:34
2005.06.14
Срочно, горю


1-1116938422
alertus
2005-05-24 16:40
2005.06.14
Ускорение работы с динамическими массивами


1-1117414651
rosl
2005-05-30 04:57
2005.06.14
свернуть развернуть ветку


3-1115442843
Navi
2005-05-07 09:14
2005.06.14
Уникальное поле





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский