Porovnání dokumentů

Porovnání dokumentů

Tento průvodce ukazuje, jak porovnat dva běhy textu a vytvořit sekvenci úprav mezi nimi pomocí Aspose.PDF FOSS text-diff enginu pro .NET. Vstupním bodem pro tento model porovnání je DiffOperation, jediná úprava označená s Operation (Equal, Delete, nebo Insert), společně s DiffUtils pomocnou třídou pro vyhledávání společného textu a znovusestavení diffu zpět do jeho zdrojového a cílového textu. Samostatný optimalizační průchod, popsaný v Optimalizaci diffu, kanonizuje surový výstup diffu vytvořený tímto způsobem, než je vykreslen nebo aplikován.


Model diffu: Operace a DiffOperation

Operation je výčtový typ, který klasifikuje každou úpravu v diffu: Equal označuje úsek textu, který zůstává nezměněn, Delete označuje úsek odebraný ze zdroje a Insert označuje úsek přidaný do cíle. DiffOperation spojuje hodnotu Operation s Text, na kterou se vztahuje, a implementuje IEquatable<DiffOperation>, aby mohly být dvě úpravy porovnány z hlediska rovnosti.

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"

Vyhledávání společného textu pomocí DiffUtils

DiffUtils je statická pomocná třída používaná diff engine k nalezení společného prefixu a sufixu sdílených dvěma řetězci před tím, než je rozdílná prostřední část diffována. FindCommonStartParts najde společný prefix a FindCommonEndParts najde společný sufix; přetížení FindCommonEndParts přijímá startIndex, aby hledání sufixu mohlo být omezeno na text následující po již nalezeném prefixu.

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);

Opětovné sestavení textu z diffu

Jakmile je diff vyjádřen jako sekvence hodnot DiffOperation, může DiffUtils rekonstruovat libovolnou stranu porovnání: AssemblySourceText znovu sestaví původní text z běhů Equal a Delete, a AssemblyDestinationText znovu sestaví revidovaný text z běhů Equal a 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"

Porovnávání a hlášení úprav

DiffOperation přepisuje Equals, GetHashCode a ToString, takže úpravy lze porovnávat kvůli rovnosti nebo zapisovat do logů a testovacího výstupu bez dalšího konverzního kódu.

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());

Tipy a osvědčené postupy

  • DiffOperation je neměnný a implementuje IEquatable<DiffOperation> — použijte Equals k porovnání dvou úprav místo porovnání referencí.
  • Nejprve najděte společný prefix pomocí FindCommonStartParts, poté předávejte jeho délku do přetížení startIndex funkce FindCommonEndParts, abyste zabránili dvojitému započítání krátkého společného prefixu jako součásti sufixu.
  • Použijte AssemblySourceText a AssemblyDestinationText k ověření, že sekvence hodnot DiffOperation se vrací k přesnému původnímu a revidovanému textu, než se na ni spolehnete jinde.
  • Považujte běhy Operation.Equal za nečinné (no-ops) při vykreslování vizuálního diffu a zvýrazněte pouze běhy Delete a Insert.
  • Tento engine porovnává text, ne dokumenty přímo — nejprve extrahujte text, který chcete porovnat (například ze stránky nebo dokumentu), než vytvoříte diff.

Časté problémy

ProblémPříčinaOprava
AssemblySourceText / AssemblyDestinationText výstup neodpovídá originálůmSeznam diffs je neúplný nebo jsou jeho položky DiffOperation v nesprávném pořadíZahrňte každou úpravu do sekvence v původním pořadí, v jakém se úpravy objevily
FindCommonEndParts vrací neočekávaný výsledek u krátkých, podobných řetězcůVyhledávání společné přípony překrývá text, který již byl zachycen pomocí FindCommonStartPartsPředávejte délku vrácenou FindCommonStartParts jako argument startIndex
Equals vrací false pro úpravy, které vypadají identickyHodnoty Text se liší mezerami nebo velikostí písmenNormalizujte text (odstraňte okraje / převeďte na stejný případ) před vytvořením hodnot DiffOperation, které chcete porovnat
Výstup diffu vypadá hlučně nebo zbytečně roztříštěněSurové sekvence DiffOperation ještě nejsou kanonizoványProveďte sekvenci optimalizačním průchodem popsaným v Optimalizace diffu

FAQ

Co porovnává Diff engine?

Porovnává úseky textu a vytváří sekvenci hodnot DiffOperation, které popisují úpravy — nezměněný, smazaný nebo vložený text — potřebné k převodu jednoho řetězce na druhý.

Jaké typy úprav podporuje Operation?

Tři: Equal pro nezměněný text, Delete pro text odstraněný ze zdroje a Insert pro text přidaný v cíli.

Jak zjistím, zda jsou dvě úpravy stejné?

Zavolejte Equals na instanci DiffOperation, nebo přímo porovnejte její vlastnosti Operation a Text.

Mohu získat původní a upravený text z diffu?

Ano — předáte seznam hodnot DiffOperation do DiffUtils.AssemblySourceText pro původní text a DiffUtils.AssemblyDestinationText pro upravený text.

Tato stránka pokrývá slučování nebo čištění diffu?

Ne — kanonizace surového diffu (sloučení sousedních úseků, posouvání úprav přes ekvivalence) je pokryta samostatně v Optimalizace diffu.


API Reference Shrnutí

Třída / MetodaPopis:
OperationVýčet klasifikující úpravu jako Equal, Delete nebo Insert
DiffOperationJedna úprava: Operation spárovaný s Text, na který se vztahuje
DiffOperation.OperationHodnota Operation pro tuto úpravu
DiffOperation.TextÚsek textu, na který se tato úprava vztahuje
DiffOperation.EqualsPorovnává dvě úpravy pro rovnost podle Operation a Text
DiffOperation.ToStringVykresluje úpravu jako řetězec pro logování nebo zobrazení
DiffUtilsStatická pomocná třída s nástroji pro diffování textu
DiffUtils.FindCommonStartPartsNajde společný prefix sdílený dvěma řetězci
DiffUtils.FindCommonEndPartsNajde společnou příponu sdílenou dvěma řetězci, volitelně od indexu
DiffUtils.AssemblySourceTextZnovu sestaví původní text ze seznamu hodnot DiffOperation
DiffUtils.AssemblyDestinationTextZnovu sestaví revidovaný text ze seznamu hodnot DiffOperation

Viz také:

 Čeština