0 / 0 / 0
Регистрация: 19.03.2011
Сообщений: 6
|
||||||
1 | ||||||
Нахождение одинаковых строк в двух файлах и вывод результата в третий файл25.09.2016, 00:37. Показов 4095. Ответов 4
Метки нет (Все метки)
Помогите пожалуйста.
Есть два тестовых файла, которые содержат строки (файлы большие, по 60k строк в каждом). Задача сравнить эти два этих файла и найти одинаковые строки и вывести эти строки в третий файл, который программа будет создавать. Структура файла такова, что все строки имеют фиксированную длину (41 символ). Пример: Кликните здесь для просмотра всего текста
"h0001d8b9g13d6g4605g85e9g708fe1e537c8"_
"h000310b1gc6f0g4341gbbddgf1f5fc471eae"_ В конце программы нужно вывести на экран количество одинаковых строк, которые были найдены программой, иначе написать "Не найдено" Что у меня получилось:
Подскажите пожалуйста, где я ошибся? Добавлено через 17 минут Если что самый похожий вариант Переписать в третий файл только те строчки, которые есть и в первом, и во втором файлах. уже был испробован - в файл результата не выводится ни одной строки.
0
|
25.09.2016, 00:37 | |
Ответы с готовыми решениями:
4
Строки, имеющиеся в двух заданных текстовых файлах, записать в третий файл (файловый ввод/вывод) Сравнение двух текстовых файлов и вывод уникальных строк в третий файл Сравнение строк в двух TextBox с выводом результата в третий Проверка наличия одинаковых строк в двух файлах |
Модератор
|
|||||||||||
25.09.2016, 13:25 | 2 | ||||||||||
А покажите-ка сначала результат выполнения вот такой простой программки:
Кроме того, приведенные вами выше строки имеют длину 40 символов, а не 41. Не хотите переместиться с задачей в раздел Free Pascal, там нет смешных ограничений "640 КБ хватит всем". Добавлено через 18 минут PS. Если бы нужно было решение задачи безотносительно языка, то в Linux было бы достаточно выполнить
0
|
0 / 0 / 0
Регистрация: 19.03.2011
Сообщений: 6
|
|
25.09.2016, 17:49 [ТС] | 3 |
Кликните здесь для просмотра всего текста
Код
40 22 68 30 30 30 31 64 38 62 39 67 31 33 64 36 67 34 36 30 35 67 38 35 65 39 67 3 7 30 38 66 65 31 65 35 33 37 63 38 22 5F 41 22 68 30 30 30 31 64 38 62 39 67 31 33 64 36 67 34 36 30 35 67 38 35 65 39 67 3 7 30 38 66 65 31 65 35 33 37 63 38 22 5F 20 Ошибка выполнения 104 по адресу 0000:0270. 40 22 68 30 30 30 31 64 38 62 39 67 31 33 64 36 67 34 36 30 35 67 38 35 65 39 67 3 7 30 38 66 65 31 65 35 33 37 63 38 22 5F 41 22 68 30 30 30 31 64 38 62 39 67 31 33 64 36 67 34 36 30 35 67 38 35 65 39 67 3 7 30 38 66 65 31 65 35 33 37 63 38 22 5F 20 40 22 68 30 30 30 31 64 38 62 39 67 31 33 64 36 67 34 36 30 35 67 38 35 65 39 67 3 7 30 38 66 65 31 65 35 33 37 63 38 22 5F 41 22 68 30 30 30 31 64 38 62 39 67 31 33 64 36 67 34 36 30 35 67 38 35 65 39 67 3 7 30 38 66 65 31 65 35 33 37 63 38 22 5F 20 если это поможет с решением, то несомненно
0
|
Модератор
|
|
25.09.2016, 18:30 | 4 |
Во FreePascal можно использовать больше памяти (в разумных пределах 2ГБ для Win32 = "2 ГБайта хватит всем") и применить тип (класс) TStringList со свойством сортировки и удаления дубликатов. Тогда задача сводится к подсчёту (=выводу) одинаковых элементов (=строк) в двух упорядоченных массивах (=файлах).
Почти похожим методом можно воспользоваться и в TurboPascal - правда, я никогда не задумывался о способах использования памяти сверх 1 МБайта под DOS одноимённым объектом TStringList.
0
|
Модератор
|
|||||||||||||||||||||||||||||||||||||||||
26.09.2016, 14:51 | 5 | ||||||||||||||||||||||||||||||||||||||||
Сообщение было отмечено Памирыч как решение
Решение
Messa,
теперь внимательно смотрим на вывод: Код
40 ... 22 5F 41 ... 22 5F 20 Выход простой -- после чтения строки обрезать пробелы с хвоста:
Но можно использовать "военную хитрость" -- поручить усекновение строки компилятору и получить необходимое "безвозмездно, то есть даром":
Улучшенная версия с использованием буфера на 1598 строк (больше не поместится в одном сегменте) и двоичным поиском в нем:
Также может быть оптимизацией использование для сортировки массива указателей на строки вместо самих строк. Здесь накладные расходы по памяти составят почти 10% (4 байта на указатель / 41 байт на строку). Добавлено через 42 минуты С текущими ограничениями алгоритмически проще всего подложить под p 10 буферов:
Вероятно, есть смысл увеличить файловые буферы:
Итого:
Добавлено через 2 часа 30 минут Либо с p в динамической памяти и файловыми буферами в сегменте данных, что принципиально от предыдущего варианта не отличается:
0
|
26.09.2016, 14:51 | |
26.09.2016, 14:51 | |
Помогаю со студенческими работами здесь
5
В двух файлах найти одинаковые строки и записать в третий файл Сравнение данных из двух массивов и вывод результата в третий Перемножение значений двух Edit и вывод результата в третий В двух файлах записаны отсортированные массивы, объединить их, записать результат в третий файл Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |