Название: Количество строк в текстовом файле Отправлено: Andrew Vladoff от Май 14, 2010, 15:53 Как узнать количество строк в текстовом файле?
Название: Re: Количество строк в текстовом файле Отправлено: spectre71 от Май 14, 2010, 15:58 Как узнать количество строк в текстовом файле? Посчитать. Название: Re: Количество строк в текстовом файле Отправлено: niXman от Май 14, 2010, 16:30 Код
Название: Re: Количество строк в текстовом файле Отправлено: garryHotDog от Май 14, 2010, 16:43 Можно вот так:
Код
Название: Re: Количество строк в текстовом файле Отправлено: Igors от Май 14, 2010, 18:04 Код
Название: Re: Количество строк в текстовом файле Отправлено: niXman от Май 14, 2010, 18:12 в STL, символы завершения строки, зависят от конкретной ОС.
естественно, что ни std::ifstream, ни std::istream_iterator, по умолчанию не выполняют никакой проверки на сей предмет. при необходимости можно немного допилить. Название: Re: Количество строк в текстовом файле Отправлено: Igors от Май 14, 2010, 18:21 в STL, символы завершения строки, зависят от конкретной ОС. Если не затруднит - допилите. Утилитка для создания текстовиков с разными концами строк здесь http://www.prog.org.ru/topic_11267_30.html (http://www.prog.org.ru/topic_11267_30.html) (последний пост)естественно, что ни std::ifstream, ни std::istream_iterator, по умолчанию не выполняют никакой проверки на сей предмет. при необходимости можно немного допилить. Название: Re: Количество строк в текстовом файле Отправлено: niXman от Май 14, 2010, 18:33 в STL, символы завершения строки, зависят от конкретной ОС. Если не затруднит - допилите. Утилитка для создания текстовиков с разными концами строк здесь http://www.prog.org.ru/topic_11267_30.html (http://www.prog.org.ru/topic_11267_30.html) (последний пост)естественно, что ни std::ifstream, ни std::istream_iterator, по умолчанию не выполняют никакой проверки на сей предмет. при необходимости можно немного допилить. Название: Re: Количество строк в текстовом файле Отправлено: Igors от Май 14, 2010, 18:44 то что приатачено тут? : http://www.prog.org.ru/index.php?topic=11267.msg72661#msg72661 даНазвание: Re: Количество строк в текстовом файле Отправлено: kambala от Май 14, 2010, 22:17 Код
Название: Re: Количество строк в текстовом файле Отправлено: niXman от Май 14, 2010, 22:42 Код
Название: Re: Количество строк в текстовом файле Отправлено: garryHotDog от Май 14, 2010, 22:51 split('\n') - более длительная операция, потому что происходит поиск 2ух байт, я думаю обычный пошаговый проход!
Название: Re: Количество строк в текстовом файле Отправлено: Авварон от Май 14, 2010, 23:05 Код: QFile f("in.txt"); Название: Re: Количество строк в текстовом файле Отправлено: ритт от Май 14, 2010, 23:58 Код: int n = 0; Название: Re: Количество строк в текстовом файле Отправлено: sendevent от Май 15, 2010, 03:12 чето зацепило :D
дисклаймер: надеюсь, все мы понимаем, что одноразовый тест - не предмет для обсуждения красот и правильностей кода. для тех, хто не понимает - у меня уже готовы куклы вуду, осталось вписать ник ;) а серьезно - если вдруг сотворил дето косяк, пошатнувший основы вселенной - в лс! а то тут начнется... Код: #include <iostream> вкратце: Цитата: gcc version 4.4.1 /gcc-4_4-branch revision 150839/ (SUSE Linux) The testShortWithoutSpaces.txt contains 1024 lines "line_line" qt-based варианты (сплит и построчное чтение QTextStream'ом) - самые прожорливые, QString::count( const QString & - не регвыр!) - довольно шустр, но, как и предыдущие, не учитывает размер файла (обходится, но... оно того не стоит, читаем дальше). стл-вариант в текущем виде не канает для студии и в качестве разделетиля всасывает и пробелы (если верить гуглу - лечится, но я не стал заморачиваться).1024 lines were found at 1 ms by nixMan 1024 lines were found at 7 ms by harryHotDog 1024 lines were found at 0 ms by sendevent 1025 lines were found at 1 ms by kambala 1024 lines were found at 0 ms by konstantin The testShortWithSpaces.txt contains 1024 lines "line line" 2048 lines were found at 0 ms by nixMan 1024 lines were found at 1 ms by harryHotDog 1024 lines were found at 0 ms by sendevent 1025 lines were found at 1 ms by kambala 1024 lines were found at 0 ms by konstantin The testLongtWithoutSpaces.txt contains 1048576 lines "line_line" 1048576 lines were found at 349 ms by nixMan 1048576 lines were found at 777 ms by harryHotDog 1048576 lines were found at 90 ms by sendevent 1048577 lines were found at 884 ms by kambala 1048576 lines were found at 69 ms by konstantin The testLongtWithSpaces.txt contains 1048576 lines "line line" 2097152 lines were found at 635 ms by nixMan 1048576 lines were found at 776 ms by harryHotDog 1048576 lines were found at 85 ms by sendevent 1048577 lines were found at 864 ms by kambala 1048576 lines were found at 69 ms by konstantin итог: самый ps: пока писал тест - обратил внимание: нихто не закрывает файлы. это обусловлено а) забыл; б) это пример кода - тут не важно; в) QFile при уничтожении сам все закроет? если в) - както я это упустил (а лезть в ассист - уже лень). Название: Re: Количество строк в текстовом файле Отправлено: Igors от Май 15, 2010, 04:48 в) QFile при уничтожении сам все закроет? Да. закроет. И еще одна мелочь: в студии может быть очень большая разница между STL скомпиленным в "debug" и "release". Для чистоты эксперимента (и чтобы избежать возможных обвинений в необъективности) нужно использовать "release". А вообще спасибо за проделанную работу - приятно видеть реальные факты и цифры. Конструктивно, по делу.если в) - както я это упустил (а лезть в ассист - уже лень). Название: Re: Количество строк в текстовом файле Отправлено: ритт от Май 15, 2010, 05:15 и использованием QTestLib результат был бы точнее, а код проще.
и почему это я - задро^W нерд? лишь из-за того, что мой код оказался много шустрее других? ( Название: Re: Количество строк в текстовом файле Отправлено: sendevent от Май 16, 2010, 01:02 Цитата: Igors <...>в студии может быть очень большая разница<...> я ж грю - STL-вариант в приведенном виде студией (2008) не собирается. решение с переопределением Код: istream operator>>(istream& is, MyCustomStringImp& s) Цитата: Константин и использованием QTestLib результат был бы точнее, а код проще. стыдно признаться, КуТест никада не трогал... обещаю исправится, в аттаче - первый опыт.Цитата: Константин и почему это я - задро^W нерд? лишь из-за того, что мой код оказался много шустрее других? ( ну... мы же брутальные программисты, да еще и в рунете - если скажу "чувак, малаццом!" - может быть воспринято как "плюс адин", потому и приходится доносить мысли через дебри ироний, сарказмов, самоироний-самосарказмов и ваще поддерживать вид программиста с нЕрдически-стойким характером.(как бы, задрот тут - я, ибо заморочился на такую, казалось бы, мелочь, как сабж, на таком уровне; да и еще, оказывается, обожаю, блин, запятые). и так, перевод на КуТест, поточнее и пооопешнее, "первая кровь". приведенные примеры кода постарался прооптимизировать - выкинул ненужные закрытия файлов, вместо break'ов - return'ы, поправил написание ника nixMan vs niXman, но это шутка. результат, вроде, не особо отличается, и теперь он примерно такой: Цитата: programm uotput ********* Start testing of LinesCounterTest ********* Config: Using QTest library 4.6.3, Qt 4.6.3 PASS : LinesCounterTest::initTestCase() <тут должно быть самое интересное, но получается большая простыня текста, поэтому выкинул. кому интересно - сами могут запустить тест> PASS : LinesCounterTest::cleanupTestCase() Totals: 6 passed, 2 failed, 0 skipped ********* Finished testing of LinesCounterTest ********* или так: Цитировать author shortNS/shortWS longNS/longWS здесь: short=1024, long=short*short, NS=NoSpaces, WS=WithSpaces, точка - дробь, запятая - тысячи.niXman 0.4/-- 430/-- garryHotDog 1.4/1.3 1,397/1,305 sendevent 0.16/0.15 270/246 kambala 0.84/0.75 1,315/1,319 konstantin 0.11/0.10 115/113 при этом всплыла "неочевидная" особенность - в зависимости от исходного файла и отношения к пустым строкам в счестчике - сфейлить могут все приведенные варианты. (N строк в файле - необязательно N "переводов строк", и не всегда надо игнориовать пустую... комуто может показаться банальным, но я сразу об этом не подумал). для теста используются файлы "кадждая строка с endl", чтобы работать с "последняя строка - без endl'а" - каждый вариант можно лехко допилить. ну и, как можно было догадаться, опять не рассматривается вариант "на платформе X файл с endl'ами с платформы Y" - тот, у кого стоит такая задача, должен быть в состоянии самостоятельно воспользоваться ранее приведенным примером. (цель была не "протестить все на всем", а так, в общих чертах). Название: Re: Количество строк в текстовом файле Отправлено: spectre71 от Май 16, 2010, 13:19 1) Не правильно создаятся тестовые файлы!
Они открываются в текстовом режиме, соответственно под windows: #define CURRENT_LINES_DELEMITER "\r\n" в конце строки образует 0D0D0A :) 2) Общее кол-во строк всегда считается с учетом пустых строк. И здесь без вариантов. Не надо путать с задачей подсчета кол-ва непустых строк. Так что не один из методов не дает правильный результат. Название: Re: Количество строк в текстовом файле Отправлено: spectre71 от Май 16, 2010, 14:36 Код
Самый быстрый способ подсчета строк. Хорошо видно на больших файлах (100 MB; 1,2,10 GB, ...) Понимает любые перносы строк, в том числе и комбинированные, а также испорченные файлы редактировавшиеся на разных плаформах (преносы типа "0D0D0A0D" итп) Замена способа чтения буфера: - "read" на "fread" - увеличит время ~ на 15% - "read" на "QFile::read" - увеличит время ~ на 70% Для подсчета строк кол-во состояний можно и уменьшить, поскольку часть из них нужна для определения начал и концов строк. Название: Re: Количество строк в текстовом файле Отправлено: Igors от Май 17, 2010, 00:10 Ну если уж такое дело - вот мой вариант приаттачен. Интересно сравнить по скорости с предыдущими. Мне кажется разумный баланс это:
- большие файлы обрабатывать надо, не стоит надеяться что все влезет в память - концы строк "чужой платформы" обрабатывать надо, эта ситуация встречается часто - смешанные (битые) концы строк - мне кажется это уже перебор, здесь можно и соврать :) И еще немаловажно: ф-ция должна быть достаточно простой и понятной. Spectre, я верю что Ваш вариант самый быстрый, но разобраться в нем ... Что делать если где-то заклинит? Ломать голову с теорией автоматов? :) Пусть лучше медленнее - зато намного проще Название: Re: Количество строк в текстовом файле Отправлено: spectre71 от Май 17, 2010, 12:09 Два варианта
================= Мой: Код
Немного переделаный вариант Igors: Код
В аттаче тестовые файлы с разными типами переводов строк Название: Re: Количество строк в текстовом файле Отправлено: sendevent от Май 19, 2010, 03:41 раз уж никому, кроме меня, не интересно - "по традиции", циферь:
тестировалось на Цитата: sendevent@notebook qt 4.6.3, gcc 4.4.1, oSuSE 11.2, x86_64 (KDE 4.3.5 r0, если че) тестовые файлы - чуть выше в треде: info.txt/lines-bad.txt/lines-good-lin.txt/lines-good-win.txt.исходные файлы не изменялись, один прогон (файлы - 488/127/116/154 b соответственно): Цитата: std::out, ms spectre: исходные данные увеличены таким образом (больше - у меня не помещается в ~):0.017/0.015/0.015/0.015 igors: 0.014/0.014/0.017/0.042 Код: void createLongFile( const QString& strFileName ) Цитата: std::out, ms spectre: (*) -- разница между прогонами (spectre's 109 vs 87 on info.txt)- хз почему: оба раза - молча курил в сторонке, машинку дополнительно ничем не загружал (в кроне нифига нету, апдейты - вручную, активен тока криейтор и дельфин), но, похоже, либо я чегото накосячил (непойму хде), либо кьют чегото скешировала.1st: 109,592/18,213/16,003/22,033 (*) 2nd: 87,450/18,911/17,738/20,919 igors: 1st: 68,267/17,894/16,370/22,062 2nd: 65,527/18,603/15,370/21,145 Название: Re: Количество строк в текстовом файле Отправлено: spectre71 от Май 19, 2010, 10:01 (*) -- разница между прогонами (spectre's 109 vs 87 on info.txt)- хз почему: оба раза - молча курил в сторонке, машинку дополнительно ничем не загружал (в кроне нифига нету, апдейты - вручную, активен тока криейтор и дельфин), но, похоже, либо я чегото накосячил (непойму хде), либо кьют чегото скешировала. Естественно что система кеширует файлы. Повторный запуск подряд на том же файле размером в 1GB может дать разницу в порядок и больше! Что и было в моих тестах. Время чтения из файла(которое может сильно варьировать) почти не имеет отношения к проверке скорости работы алгоритма и это необходимо учитывать. |