Порівняння документів

Порівняння документів

Порівняння документів

Цей посібник показує, як порівняти два варіанти тексту та створити послідовність правок між ними, використовуючи Aspose.PDF FOSS text-diff engine для .NET. Точка входу для цієї моделі порівняння є DiffOperation, окрема правка, позначена Operation (Equal, Delete, або Insert), разом із DiffUtils допоміжним класом для знаходження спільного тексту та повторного складання diff у його вихідний та цільовий текст. Окремий етап оптимізації, описаний у Оптимізація Diff, канонізує необроблений diff-вивід, створений таким чином, перед його відображенням або застосуванням.


Модель дифу: Операція та DiffOperation

Operation — це enum, який класифікує кожну правку у дифі: Equal позначає фрагмент тексту, який не змінився, Delete позначає фрагмент, видалений з джерела, а Insert позначає фрагмент, доданий у цільовий текст. DiffOperation поєднує значення Operation з Text, до якого воно застосовується, і реалізує IEquatable<DiffOperation>, щоб дві правки можна було порівняти на рівність.

using Aspose.Pdf.Comparison.Diff;

// A single edit consists of an Operation and the run of text it applies to.
var unchanged = new DiffOperation(Operation.Equal, "Aspose.PDF ");
var removed = new DiffOperation(Operation.Delete, "for .NET Framework");
var added = new DiffOperation(Operation.Insert, "FOSS for .NET");

Console.WriteLine(unchanged.Operation); // Equal
Console.WriteLine(added.Text);          // "FOSS for .NET"

Пошук спільного тексту за допомогою DiffUtils

DiffUtils — це статичний допоміжний клас, який використовується движком дифу для знаходження спільного префікса та суфікса, спільних для двох рядків, перед тим як різна середня частина буде дифована. FindCommonStartParts знаходить спільний префікс, а FindCommonEndParts — спільний суфікс; перевантаження FindCommonEndParts приймає startIndex, щоб пошук суфікса можна було обмежити текстом, який йде після вже знайденого префікса.

string original = "The quick brown fox";
string revised = "The quick red fox jumps";

var commonStart = DiffUtils.FindCommonStartParts(original, revised);
var commonEnd = DiffUtils.FindCommonEndParts(original, revised);

Відновлення тексту з дифу

Коли diff виражається як послідовність значень DiffOperation, DiffUtils може відновити будь-яку сторону порівняння: AssemblySourceText відбудовує оригінальний текст з Equal і Delete запусків, а AssemblyDestinationText відбудовує оновлений текст з Equal і Insert запусків.

using System.Collections.Generic;

var diffs = new List<DiffOperation>
{
    new DiffOperation(Operation.Equal, "The quick "),
    new DiffOperation(Operation.Delete, "brown"),
    new DiffOperation(Operation.Insert, "red"),
    new DiffOperation(Operation.Equal, " fox")
};

string sourceText = DiffUtils.AssemblySourceText(diffs);
string destinationText = DiffUtils.AssemblyDestinationText(diffs);

Console.WriteLine(sourceText);      // "The quick brown fox"
Console.WriteLine(destinationText); // "The quick red fox"

Порівняння та звітування про зміни

DiffOperation переопреділяє Equals, GetHashCode і ToString, тому зміни можна порівнювати на рівність або записувати в журнали та тестовий вивід без додаткового коду конвертації.

var a = new DiffOperation(Operation.Equal, "PDF");
var b = new DiffOperation(Operation.Equal, "PDF");

bool same = a.Equals(b); // true - same Operation and Text
Console.WriteLine(a.ToString());

Поради та найкращі практики

  • DiffOperation є незмінним і реалізує IEquatable<DiffOperation> — використовуйте Equals для порівняння двох змін, а не рівність посилань.
  • Спочатку знайдіть спільний префікс за допомогою FindCommonStartParts, потім передайте його довжину у перевантаження startIndex функції FindCommonEndParts, щоб уникнути подвійного підрахунку короткого спільного префікса як частини суфікса.
  • Використовуйте AssemblySourceText і AssemblyDestinationText, щоб перевірити, що послідовність значень DiffOperation проходить круговий шлях до точного оригінального та оновленого тексту, перш ніж покладатися на неї в іншому місці.
  • Розглядайте запускі Operation.Equal як бездіяльність під час рендерингу візуального diff і підсвічуйте лише запускі Delete і Insert.
  • Цей движок порівнює текст, а не документи безпосередньо — спочатку витягніть текст, який ви хочете порівняти (наприклад, зі сторінки або документа), перед створенням різниці.

Типові проблеми

ПроблемаПричинаВиправити
AssemblySourceText / AssemblyDestinationText вихід не відповідає оригіналамСписок diffs неповний або його DiffOperation записи не у правильному порядкуВключіть кожне редагування у послідовність у тому ж порядку, у якому вони відбулися
FindCommonEndParts повертає неочікуваний результат для коротких, схожих рядківПошук спільного суфікса перекриває текст, вже збігнутий FindCommonStartPartsПередайте довжину, яку повертає FindCommonStartParts, як аргумент startIndex
Equals повертає false для правок, які виглядають ідентичноЗначення Text відрізняються пробілами або регістромНормалізуйте текст (усічення / уніфікація регістру) перед створенням значень DiffOperation, які ви плануєте порівнювати
Вивід diff виглядає шумним або зайво фрагментованимНеоброблені послідовності DiffOperation ще не канонізованіЗапустіть послідовність через оптимізаційний прохід, описаний у Оптимізація Diff

FAQ

Що порівнює движок Diff?

Він порівнює послідовності тексту і створює послідовність значень DiffOperation, що описують правки — незмінений, видалений або вставлений текст — необхідне для перетворення одного рядка в інший.

Які типи правок підтримує Operation?

Три: Equal для незмінного тексту, Delete для тексту, видаленого з джерела, і Insert для тексту, доданого в призначення.

Як перевірити, чи два правки однакові?

Викличте Equals на екземплярі DiffOperation, або порівняйте його властивості Operation та Text безпосередньо.

Чи можу я отримати оригінальний та переглянутий текст з diff?

Так — передайте список значень DiffOperation у DiffUtils.AssemblySourceText для оригінального тексту та у DiffUtils.AssemblyDestinationText для переглянутого тексту.

Чи охоплює ця сторінка злиття або очищення diff?

Ні — канонізування необробленого diff (об’єднання суміжних ділянок, зсув правок через рівності) розглядається окремо в Оптимізація Diff.


API Reference Підсумок

Клас / МетодОпис
OperationПерелічення, що класифікує правку як Equal, Delete або Insert
DiffOperationОдин елемент правки: Operation, пов’язаний з Text, до якого він застосовується
DiffOperation.OperationЗначення Operation для цієї правки
DiffOperation.TextПослідовність тексту, до якої застосовується це редагування
DiffOperation.EqualsПорівнює два редагування на рівність за допомогою Operation та Text
DiffOperation.ToStringВідображає редагування у вигляді рядка для журналювання або відображення
DiffUtilsСтатичний допоміжний клас з утилітами для порівняння тексту
DiffUtils.FindCommonStartPartsЗнаходить спільний префікс, який ділять два рядки
DiffUtils.FindCommonEndPartsЗнаходить спільний суфікс, спільний для двох рядків, опційно, починаючи з індексу
DiffUtils.AssemblySourceTextЗбирає оригінальний текст зі списку значень DiffOperation
DiffUtils.AssemblyDestinationTextЗбирає відкоригований текст зі списку значень DiffOperation

Дивіться також

 Українська