Сравнение строк текстового файла. Как это сделать?

Раздел форума: 

Аватар пользователя admin

Автор темы: 

Павел
Имеется текстовый файл. Его взяли и изменили, и записали под другим именем. Как сравнить эти два файла? Необходимо сказать, какая строка изменена, какая удалена или вставлена.

Что-то подобное есть уже в спец. утилите в Wimdows Commander. Однако интересует сам алгоритм: как же все-таки сравнивать строки?

 
Аватар пользователя Юрий
Если пишешь на Delphi, то можешь вгрузить оба файла в TStrings и работать с ними как с массивами строк.

Далее вводишь еще один массив of integer, его размер должен быть равен количеству строк в том файле, где их больше. Читаешь построчно оба файла, если первая строка есть во обоих файлах, то первый элемент массива равен нулю, если только в первом, то 1, а если только во втором, то 2. И далее в том же ключе для второй строки и второго элемента массива

Аватар пользователя cvb (прогер)
directory.google.com/Top/Computers/Software/ File_Management/File_Comparison/Windows/?tc=1

вот вибирай любой тул какой нравится

или сразу сюда:

http://www.araxis.com/merge/index.html

ЗЫ

ваще конечно Юрий сильно помог. но зато сразу видно - на Делфи пишет

ЗЫЫ

а меня вот сдавна такой вопрос интересовал - а почему именно TString? ну в MFC там CString, мол class, а вот чего это Т? типа турбо? ;-)

Аватар пользователя Андрюха
Есть такая утилита -- diff. Правда под unix. Под виндой можно поставить cygwin -- своего рода эмулятор юниксоидной командной строки. Получишь всю мощь различных юниксоидных "шеллов" плюс кучу полезных и не очень утилит (grep, more, diff, awk, vi и т.д)

Про Делфю забавно. Хотя мое предложение не намного реалистичнее :) Но ИМХО оно имеет определенный смысл в перспективе - знать стандартные юниксоидные утилиты полезно.

Кстати, "T*" у борландов исторически обозначает "Type"

Аватар пользователя Singerschucher
берем Unix или Cygwin, и запускаем diff

diff file1.txt file2.txt

усе.

Аватар пользователя mike
Да вы что, смеётесь? Парень же ясно спросил, что ему надо сравнить два текстовых файла, да WindiwsCommander'ом не знает, как сделать. Ставить UNIX или учить программирование!? Павел, включи этот коммандер, введи командную строку fc | more и не забудь нажать Энтер. Любуйся результатом. Правда, ты не указываешь, что за формат текста у тебя. Если ответ DOS-команды fc (читается file compare) покажется тебе непонятным, скажем, будут выведены коды несовпадающих символов (а не сами символы) в несовпадающих строках, то сначала преобразуй свои тексты в ДОС. Надеюсь, знаешь, как это делается.
Аватар пользователя Павел
Народ, сравнение файлов с помощью утилит и программ - это все не то! Мне надо написать программу с этим алгоритмом. Как эффективно реализовать сравнение a[i] с b[i], где i - текущая строка, а и b - файлы. КАк?

2 mike (вечный студент): в windows commander - образец, как надо сделать (меню Файл - compare by content). Мне же надо это реализовать....

Аватар пользователя cvb (прогер)
мля, Паша, ну вы как то определитесь что ли...
Аватар пользователя S_Mall
Есть такая программуля, Araxis Merge (у меня на машине стоит 2001 Professional Evaluation), лучше её для сравнивания файлов(тектовых, исходников и т.д.) я еще не видел.
Аватар пользователя VitFil
Насколько я понял, человеку нужна не программуля, а сам алгоритм.
Аватар пользователя S_Mall
Хм... В принципе все абсолютно тривиально, насколько мне кажется, по крайней мере, насколько я себе прикинул алгоритм в Java. Берешь BufferedReader, считываешь файлы по строкам, загоняешь их в два String[] и в принципе делай с ними дальше что хочешь, можешь совпадения искать по строкам, можешь по тексту и погнал... :)
Аватар пользователя S_Mall
А сами строки можно в свою очередь разбить на слова и при определенном проценте совпадения слов(при неполном совпадении) считать, что строка изменена, иначе - вставлена. Если этого недостаточно, то можно слова на буквы разбивать, хотя ИМХО тут точного алгоритма и не составишь.
Аватар пользователя cvb (прогер)
из этого форума я понял две вещи:

1 народ не умеет писать

2 народ не умеет читать

но а ваще - до фига народу делать нечего ;-)

Павел, ты не забудь написать как жы все таки там все сравнил

Аватар пользователя programmer
2s_mall

А еще сторока может быть удалена, между прочим. :))) и где это таких программеров держат... да еще на яве...

не даром она потиху помирает... :)

Аватар пользователя NikE
to S_Mall

Не все так просто. Прав cvb.

Это достаточно сложная математическая задача. Под нее есть определенная теория. Поищите в инете "Common Longest Subsequence", LCS, Fast LCS. Существует ряд алгоритмов различной модификации. Решение задачи "в лоб" приводит к непомерному росту времени работы алгоритма. При двух файлах размером в 2-3 Мб можно смело идти кофе пить часиков эдак на пару ;-) А при использовании "нормального" алгоритма - 3-4 секунды. Данный алгоритм используется в юниксоидном diff. Исходники на чистом Анси С есть как Open Source. Все можно найти и "приспособить" :-)

Теория здесь:

"An O(ND) Difference Algorithm and Its Variations*"

EUGENE W. MYERS

Николай

www.nikeware.com

p.s. Кстати ссылка имеет к обсуждаемой проблеме самое непосредственное отношение ;-)

Аватар пользователя S_Mall
to NiKe: снимаю шляпу, если ты написал этот Visual Comparer, по крайней мере по скриншоту видно, что работа сделана со вкусом. Мои предыдущие посты - именно попытка решить задачу "в лоб". Думаю, все-таки, что для некоммерческого использования можно придумать дешевый алгоритм, хоть он будет и ресурсоемким. Под дешевым я понимаю не долгий в разработке.

Павлу: поставь себе побольше программ, типа Araxis Merge да посмотри, поюзай их, погляди что какими цветами выделяется и в каком случае, может какие алгоритмы и сами в башке всплывут :)

Аватар пользователя NikE
to S_Mall:

> по скриншоту видно, что работа сделана со вкусом.

Спасибо за снятую шляпу :) А желания посмотреть "в живую" не было? :)Попробуйте, может понравиться. Глядишь в скорости и Araxis Merge "снесешь" со своей машины :-)))

Коммерческое или нет, дело не в этом. В любом случае дешевле будет разобраться с теорией и воплотить ее в алгоритме, чем сидеть и что-то выдумывать (если вы конечно не Кнут какой-нибудь :-). Я в Visual Comparer тоже в ранних версиях "выдумывал". Поверьте это не просто. Но понимаешь это только тогда, когда прочитаешь теорию по предмету. После этого осознаешь, что против математики не "попрешь".

Павлу: Программы поставить нужно. Но и теорию почитать не помешает.

Аватар пользователя S_Mall
to NiKe: Довольно интересная программа. Понравилось, что отсутствие строк во втором файле по сравнению с первым выделяется пустыми строками. Был приятно удивлен, что программа подцепилась CVS-ом в качестве external diff programm. Оч. не хватает колеса - привык я к нему, а за скроллер тащить неудобно, особенно если сравниваемые файлы большие. Еще почему не снесу я Araxis - нету folder comparison (я не нашел по крайней мере), хотя вроде ж не трудно реализовать. Ну... бета она и в Африке бета, че ж сказать.

Кстати, куда в Берлине сходить можно, чего посмотреть интересного есть? Скоро зашлют в командировку, хотелось бы город посмотреть.

Аватар пользователя NikE
to S_Mall: Работа с колесом уже добавлена. В следующей версии будет доступна. Про folder comparison - Visual Comparer позиционируется мною только как file comparison tool (пока во всяком случае :-). В будущем может быть...

Про Берлин: Potsdamer Platz, кинотеатер IMax, панорамное кино - забавная вещь. Там крутят два типа фильмов - 3D и панорама. Советую панораму. Хотя и 3D тоже ничаво. Адресок здесь - www.imax-berlin.de. Там все найдешь. TIMETABLE - это расписание текущих фильмов, а здесь можно посмотреть конструкцию самого кинотеатра - http://www.imax-berlin.de/theater-dome.htm . Совет - при посещении стоит за минут 30 уже зайти в "предбанник", потому как билеты без мест, а с местами ситуция такова, что при панорамном лучше садится в центре и повыше, а то голову "сломать" можно :-). Поэтому лучше попасть в очередь первым.

Аватар пользователя Victor
А есть ли программа которая позволяет сравнивать только текстовое содержимое html файлов?

Или может есть программы, которые можно настроить под себя?