Dokumentum-összehasonlítás

Dokumentum-összehasonlítás

Dokumentum-összehasonlítás

Ez az útmutató bemutatja, hogyan lehet összehasonlítani két szövegsorozatot, és előállítani a közöttük lévő szerkesztési sorozatot a Aspose.PDF FOSS szöveg-diff motor segítségével a .NET számára. Ennek az összehasonlítási modellnek a belépési pontja DiffOperation, egyetlen szerkesztés, amelyhez egy Operation (Equal, Delete, vagy Insert), együtt a DiffUtils segédosztály a közös szöveg megtalálásához és a diff visszaállításához a forrás- és célszövegbe. Egy külön optimalizációs átfutás, amelyet leírva Diff optimalizáció, kanonikalizálja a így előállított nyers diff kimenetet, mielőtt megjelenítenék vagy alkalmaznák.


A Diff modell: Művelet és DiffOperation

Operation egy felsorolt típus (enum), amely besorolja a diff minden szerkesztését: Equal jelöli a változatlan szövegfolyamot, Delete a forrásból eltávolított szövegfolyamot, és Insert a célba hozzáadott szövegfolyamot. DiffOperation egy Operation értéket párosít a rá vonatkozó Text-val, és megvalósítja a IEquatable<DiffOperation>-t, hogy két szerkesztés összehasonlítható legyen egyenlőség szempontjából.

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"

Közös szöveg keresése DiffUtils segítségével

DiffUtils egy statikus segédosztály, amelyet a diff motor használ a két karakterlánc által megosztott közös előtag és utótag megtalálására, mielőtt a különböző középső rész diff-elésre kerül. FindCommonStartParts megtalálja a közös előtagot, és FindCommonEndParts megtalálja a közös utótagot; a FindCommonEndParts egy túlterhelése startIndex-t fogad el, hogy az utótag keresés korlátozható legyen a már megtalált előtagot követő szövegre.

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

Szöveg újraösszeállítása diffből

Miután egy különbség sorozatként van kifejezve a DiffOperation értékekből, a DiffUtils képes rekonstruálni a hasonlítás bármelyik oldalát: a AssemblySourceText újjáépíti az eredeti szöveget a Equal és Delete futásokból, és a AssemblyDestinationText újjáépíti a módosított szöveget a Equal és Insert futásokból.

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"

Szerkesztések összehasonlítása és jelentése

DiffOperation felülírja a Equals, GetHashCode és ToString elemeket, így a szerkesztések összehasonlíthatók egyenlőség alapján, vagy naplókba és tesztkimenetekbe írhatók extra konverziós kód nélkül.

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

Tippek és legjobb gyakorlatok

  • DiffOperation nem módosítható és megvalósítja a IEquatable<DiffOperation> – használja a Equals-t két szerkesztés összehasonlításához a referenciális egyenlőség helyett.
  • Először a FindCommonStartParts segítségével keresse meg a közös előtagot, majd adja át annak hosszát a FindCommonEndParts startIndex túlterhelésének, hogy elkerülje a rövid közös előtag duplikált számítását a suffix részeként.
  • Használja a AssemblySourceText és AssemblyDestinationText eszközöket annak ellenőrzésére, hogy egy DiffOperation értékek sorozata pontosan visszatér-e az eredeti és a módosított szöveghez, mielőtt máshol támaszkodna rá.
  • Kezelje a Operation.Equal futásokat no-op-ként a vizuális különbség megjelenítésekor, és csak a Delete és Insert futásokat emelje ki.
  • Ez a motor szöveget hasonlít össze, nem közvetlenül dokumentumokat — a szöveget, amit össze szeretnél hasonlítani (például egy oldalról vagy dokumentumból), először kell kinyerni, mielőtt diffet készítenél.

Gyakori problémák

ProblémaOkaJavítás
A AssemblySourceText / AssemblyDestinationText kimenet nem egyezik az eredetikkelA diffs lista hiányos, vagy a DiffOperation bejegyzései nincsenek helyes sorrendbenVegye bele a sorozat minden szerkesztését, az eredeti sorrendben, ahogy a szerkesztések megtörténtek
FindCommonEndParts váratlan eredményt ad rövid, hasonló karakterláncok eseténA közös utótag keresés átfedést okoz a FindCommonStartParts által már egyezett szöveggelAdja át a FindCommonStartParts által visszaadott hosszúságot startIndex argumentumként
Equals visszatér false azonosnak tűnő szerkesztésekhezA Text értékek szóköz vagy kis- és nagybetű szerint különböznekNormalizáld a szöveget (vágás / kisbetűre konvertálás) mielőtt létrehoznád a DiffOperation értékeket, amelyeket össze szeretnél hasonlítani
A diff kimenet zajosnak vagy indokolatlanul töredezettnek tűnikA nyers DiffOperation sorozatok még nincsenek kanonikalizálvaFuttasd a sorozatot a leírt optimalizálási lépésen keresztül Diff optimalizálás

FAQ

Mit hasonlít össze a Diff motor?

Futó szövegeket hasonlít össze, és egy DiffOperation értékekből álló sorozatot állít elő, amelyek leírják a szerkesztéseket — változatlan, törölt vagy beszúrt szöveg — amelyek szükségesek ahhoz, hogy az egyik karakterláncot a másikra alakítsuk.

Milyen szerkesztéstípusokat támogat a Operation?

Három: Equal a változatlan szöveghez, Delete a forrásból eltávolított szöveghez, és Insert a célba hozzáadott szöveghez.

Hogyan ellenőrizhetem, hogy két szerkesztés azonos-e?

Hívja meg a Equals egy DiffOperation példányon, vagy hasonlítsa össze közvetlenül annak Operation és Text tulajdonságait.

Visszakaphatom az eredeti és a módosított szöveget egy diffből?

Igen — adja át a DiffOperation értékek listáját a DiffUtils.AssemblySourceText számára az eredeti szöveghez, és a DiffUtils.AssemblyDestinationText a módosított szöveghez.

Ez az oldal lefedi a diff egyesítését vagy tisztítását?

Nem — a nyers diff kanonikalizálása (szomszédos futamok egyesítése, szerkesztések átsíkosítása az egyenlőségeken) külön van tárgyalva in Különbség optimalizálás.


API Reference összefoglaló

Osztály / MetódusLeírás
OperationEnum, amely egy szerkesztést Equal, Delete vagy Insert típusúként sorol be
DiffOperationEgyetlen szerkesztés: egy Operation, amely a Text-hez van párosítva
DiffOperation.OperationAz Operation érték ehhez a szerkesztéshez
DiffOperation.TextA szövegrész, amelyre ez a módosítás vonatkozik
DiffOperation.EqualsKét módosítást hasonlít össze egyenlőség szempontjából Operation és Text alapján
DiffOperation.ToStringEgy módosítást karakterláncként jelenít meg naplózáshoz vagy megjelenítéshez
DiffUtilsStatikus segédosztály szöveg-diff segédeszközökkel
DiffUtils.FindCommonStartPartsMegkeresi a két karakterlánc közös előtagját
DiffUtils.FindCommonEndPartsMegkeresi a két karakterlánc közös utótagját, opcionálisan egy indextől kezdve
DiffUtils.AssemblySourceTextÖsszeállítja az eredeti szöveget a DiffOperation értékek listájából
DiffUtils.AssemblyDestinationTextÖsszeállítja a módosított szöveget a DiffOperation értékek listájából

Lásd még:

 Magyar