![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| Gazprom |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 10.4.2009 Репутация: нет Всего: нет |
Доброе время суток.
Есть такая задачка. Требуется сравнить строки в двух файлах. На выходе должны быть созданы 2 файла, в первом будут строки которые не содержаться во втором и наоборот. Данную задача решена мною была
Но вот есть ще два условия которые меня загоняют в тупик(( 1)размер исходных файлов неизвестен. Возможно, что они будут настолько большие, что их нельзя будет загрузить в память, построить по ним в памяти хэш или дерево и т.д. 2) известно, что строки в обоих входных файла отсортированы в одинаковом лексографическом порядке Подскажи какую нить идею для решения... |
|||
|
||||
| tolkien |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 277 Регистрация: 5.4.2008 Репутация: 4 Всего: 4 |
Если памяти не хватает. Тогда грузите файлы небольшими кусочками.
|
|||
|
||||
| Gazprom |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 10.4.2009 Репутация: нет Всего: нет |
Данная задача больше является теоретической, чем практической=(
Как примерно это делается? И мож ноли будет брать определенные куски файла, например все которые начинаются на определенный символ? (в файле строки отсортированы) |
|||
|
||||
| amg |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
А зачем кусками файлы зачитывать? Можно каждый раз по одной строке.
Зачтываем по строке из каждого файла, сравниваем их оператором cmp, в зависимости от результата сравнения 0: пропускаем эти строки (они одинаковые) 1: читаем следующую строку из первого файла (или из второго, см. справку по cmp) -1: читаем следующую строку из второго файла Как то так, реализовать, вроде, несложно. |
|||
|
||||
| Gazprom |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 10.4.2009 Репутация: нет Всего: нет |
Так и сделал, вроде получилось. Вот хотелось бы чтоб прокомментировать, если есть какие нить недоработки, хотя ои скорей всего есть!!1 Заранее спасибо
|
||||
|
|||||
| sir_nuf_nuf |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: 14 Всего: 31 |
Тут есть тонкость:
Что значит "нет во втором файле" ? Нет вообще ? Тогда в любом случае вам для того что бы определить что строки нет в файле нужно его полностью просмотреть, а он в память не поместится.. В Случае если файлы отсортированы, так что строки в порядке возрастания - то решение предложил товарищ amg Таким образом для вас задача сводится к сортировке очень большого файла. Это называется внешняя сортировка и описана хорошо в книжке Дональда Кнута |
|||
|
||||
| amg |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
Gazprom, перед безусловным зачитыванием строки из файла необходимо делать проверку на конец файла
if (eof($input1)) {...} и не пытаться зачитывать очередную строку, если файл уже кончился. |
|||
|
||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |