tezarius Ну, если минимальный кусок равен абзацу (и нумерация абзацев упорядочена), то тогда WinMerge - излишне сложный инструмент. Но посмотреть общую логику их алгоритма нужно обязательно.
Цитата: С чего начать? какие функции использовать?
Начать нужно не с поиска функций, а с составления алгоритма.
Представьте, что каждый абзац - это строка. Тогда документ представляет из себя список строк. Значит, вам нужно сравнить два списка строк и определить, какие строки были изменены, какие - удалены, и какие добавлены.
Если в документе не может быть одинаковых абзацев - задача проста:
1. Каждый абзац старого документа сравниваете с каждым абзацем нового документа. Если они равны, устанавливаете для этих абзацев флаг "равно".
2. Последовательно проходите по абзацам старого документа. Находите
подряд идущие абзацы, без флага "равно". Сравниваете их количество с количеством соответствующих абзацев из нового документа. Если количество равно, то каждый из этих абзацев был
изменён на соответствующий абзац из нового документа. Если в старом документе количество этих абзацев меньше, чем в новом, значит, часть абзацев была изменена, а часть - удалена. Если больше - значит, часть абзацев была изменена, а часть добавлена.
Таким образом, для каждого абзаца из старого документа установлен один из признаков:
- равен абзацу из нового документа
- изменён в новом документе (и указатель на соответствующиё абзац в новом документе)
- удалён
в новом документе нужен только один признак:
- добавлен
И сохраняете в базу данных: для всех абзацев из старого документа, у которых не установлен признак "равен" добавляете записи с указанием признака и:
- для удалённых: порядкового номера абзаца в старом документе
- для изменённых: порядкового номера абзаца в старом документе и текста соответствующего нового абзаца
- для добавленных: порядкового номера абзаца в старом документе, после которого добавляется новый абзац и его текста.
Это приблизительно и вкратце.
Если в документе может быть несколько одинаковых абзацев - задача сравнения существенно усложнится.