![]() |
Модераторы: ginnie, korob2001 |
![]() ![]() ![]() |
|
Zynchak |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 14.12.2007 Репутация: нет Всего: нет |
Доброго дня всем!
У меня возникла проблема, а так как я только учусь писать на Перл, то и загвоздка серезная для меня. Вот суть задачи: Есть большой файл, около 30МБ. Требуется найти и подсчитать в нем все строки. К примеру, берем первую строку и ищем сколько дублей во всем файле, результат записываем в файл в виде: строка;количество Дале вторую строку и такие же операции, и так до конца файла, при том я вот незнаю как по несколько раз не считать одну и ту же строку, ведь мы ее могли уже считать. Помогите мне пожалуста, очень нужно! Заранее спасибо! |
|||
|
||||
amg |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 9 Всего: 50 |
Посмотри пока на этот код. Если не устроит, будем думать ( требуется много памяти и порядок строк произвольный будет).
Это сообщение отредактировал(а) amg - 14.12.2007, 17:07 |
|||
|
||||
Zynchak |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 14.12.2007 Репутация: нет Всего: нет |
У меня почему то ругается -
Global symbol "%h" requires explicit package name at search.pl line... Добавлено через 2 минуты и 15 секунд В принципе можно упростить задачу, сначало сделать еще один файл гдк будут только уникальные записи и уже от туда скчитывать кей а в первичном файле вести поиск. |
|||
|
||||
amg |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 9 Всего: 50 |
||||
|
||||
Ramirez |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 305 Регистрация: 18.1.2005 Где: Moscow, ExUSSR Репутация: нет Всего: 5 |
Если строки достаточно длинные (10-15 символов и более), то возможно будет эффективнее из строки сразу считать md5-хеш, и сравнивать и хранить в массиве уже их. Памяти будет требоваться меньше, но чуть больше будет нагружен процессор (вычисляя хеши) , но думаю что нагрузка будет несущественна.
|
|||
|
||||
amg |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 9 Всего: 50 |
Проверил вот такой код, печатающий только уникальные строки, сохраняющий порядок строк исходного файла и добавляющий в конец каждой строки номера строк исходного файла.
|
|||
|
||||
Zynchak |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 14.12.2007 Репутация: нет Всего: нет |
Вроде все получилось, вот код (search.pl):
#!/usr/bin/perl -w use strict; use warnings; my %h; my $path =$ARGV[0]; open( FILE, "< $path" ) or die $!; while (<FILE>) { chomp; $h{$_}++; } foreach (keys %h) { print "$_;$h{$_}\n"; } Запускаю вот так: perl search.pl key.txt >> base.txt В файле base.txt получаю вот такой результат, вроде все правильно работает: keyword-a;65 keyword-b;2 keyword-c;7 |
|||
|
||||
amg |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 9 Всего: 50 |
Еще так можно:
Этот вариант работает намного быстрее, чем мой предыдущий пример (который с сортировкой), да и памяти потребляет меньше. Добавлено через 12 минут и 15 секунд Кстати, именно для случаев такого запуска в перле имеется оператор <>. С ним файлы из аргументов сами откроются, просто
|
||||
|
|||||
OutlawZ |
|
|||
Опытный ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 269 Регистрация: 19.10.2007 Репутация: нет Всего: нет |
Если придется работать с тремя файлами одновременно ? то как подсчитать количество совпавших строк? что бы к примеру программа выводила "Эта строка повторяется n-количество раз в файлах: file.txt, file2.txt" буду признателен за ответ.
Это сообщение отредактировал(а) OutlawZ - 28.4.2011, 02:24 -------------------- ![]() ![]() |
|||
|
||||
alezzz |
|
|||
![]() сплю... ![]() ![]() Профиль Группа: Участник Сообщений: 499 Регистрация: 17.8.2009 Репутация: нет Всего: 14 |
усложните хеш, например:
|
|||
|
||||
OutlawZ |
|
|||
Опытный ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 269 Регистрация: 19.10.2007 Репутация: нет Всего: нет |
Можно пример? а то у меня каша получается в плане том что счетчик совпадений перестал работать и дописывается просто к строке, что не есть хорошо, может сделать хеш хешей????
-------------------- ![]() ![]() |
|||
|
||||
SkoobyDoo |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 4.10.2007 Репутация: нет Всего: нет |
Это сообщение отредактировал(а) SkoobyDoo - 1.5.2011, 09:33 |
|||
|
||||
alezzz |
|
|||
![]() сплю... ![]() ![]() Профиль Группа: Участник Сообщений: 499 Регистрация: 17.8.2009 Репутация: нет Всего: 14 |
Вот еще вариант, тут должно меньше памяти расходоваться на хэш:
|
|||
|
||||
OutlawZ |
|
|||
Опытный ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 269 Регистрация: 19.10.2007 Репутация: нет Всего: нет |
Всем спасибо, протестировал, доволен результатом.
-------------------- ![]() ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl: Системное программирование" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Системное программирование | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |