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
DiffOperationje neměnný a implementujeIEquatable<DiffOperation>— použijteEqualsk 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ístartIndexfunkceFindCommonEndParts, abyste zabránili dvojitému započítání krátkého společného prefixu jako součásti sufixu. - Použijte
AssemblySourceTextaAssemblyDestinationTextk ověření, že sekvence hodnotDiffOperationse vrací k přesnému původnímu a revidovanému textu, než se na ni spolehnete jinde. - Považujte běhy
Operation.Equalza nečinné (no-ops) při vykreslování vizuálního diffu a zvýrazněte pouze běhyDeleteaInsert. - 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ém | Příčina | Oprava |
|---|---|---|
AssemblySourceText / AssemblyDestinationText výstup neodpovídá originálům | Seznam 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í FindCommonStartParts | Předávejte délku vrácenou FindCommonStartParts jako argument startIndex |
Equals vrací false pro úpravy, které vypadají identicky | Hodnoty Text se liší mezerami nebo velikostí písmen | Normalizujte 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ány | Proveď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 / Metoda | Popis: |
|---|---|
Operation | Výčet klasifikující úpravu jako Equal, Delete nebo Insert |
DiffOperation | Jedna úprava: Operation spárovaný s Text, na který se vztahuje |
DiffOperation.Operation | Hodnota Operation pro tuto úpravu |
DiffOperation.Text | Úsek textu, na který se tato úprava vztahuje |
DiffOperation.Equals | Porovnává dvě úpravy pro rovnost podle Operation a Text |
DiffOperation.ToString | Vykresluje úpravu jako řetězec pro logování nebo zobrazení |
DiffUtils | Statická pomocná třída s nástroji pro diffování textu |
DiffUtils.FindCommonStartParts | Najde společný prefix sdílený dvěma řetězci |
DiffUtils.FindCommonEndParts | Najde společnou příponu sdílenou dvěma řetězci, volitelně od indexu |
DiffUtils.AssemblySourceText | Znovu sestaví původní text ze seznamu hodnot DiffOperation |
DiffUtils.AssemblyDestinationText | Znovu sestaví revidovaný text ze seznamu hodnot DiffOperation |