Compararea documentelor

Compararea documentelor

Comparare Documente

Acest ghid arată cum să compari două seturi de text și să producă secvența de editări dintre ele utilizând motorul FOSS de difuzare a textului Aspose.PDF pentru .NET. Punctul de intrare pentru acest model de comparare este DiffOperation, o singură editare etichetată cu un Operation (Equal, Delete, sau Insert), împreună cu DiffUtils clasă auxiliară pentru localizarea textului comun și reasamblarea unui diff înapoi în textul său sursă și destinație. O trecere separată de optimizare, descrisă în Optimizarea Diff, canonicalizează ieșirea brută a diff-ului produsă în acest mod înainte de a fi redată sau aplicată.


Modelul Diff: Operație și DiffOperation

Operation este enumerația care clasifică fiecare editare într-un diff: Equal marchează o secvență de text neschimbată, Delete marchează o secvență eliminată din sursă, iar Insert marchează o secvență adăugată în destinație. DiffOperation asociază o valoare Operation cu Text la care se aplică și implementează IEquatable<DiffOperation> astfel încât două editări să poată fi comparate pentru egalitate.

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"

Localizarea Textului Comun cu DiffUtils

DiffUtils este o clasă statică de ajutor utilizată de motorul de diff pentru a găsi prefixul și sufixul comun împărțit de două șiruri înainte ca secțiunea intermediară diferită să fie comparată. FindCommonStartParts localizează prefixul comun, iar FindCommonEndParts localizează sufixul comun; o suprasarcină a FindCommonEndParts acceptă un startIndex astfel încât căutarea sufixului să poată fi limitată la textul care urmează unui prefix deja localizat.

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

Reasamblarea Textului dintr-un Diff

Odată ce o diferență este exprimată ca o secvență de valori DiffOperation, DiffUtils poate reconstrui oricare dintre părțile comparației: AssemblySourceText reconstruiște textul original din execuțiile Equal și Delete, iar AssemblyDestinationText reconstruiște textul revizuit din execuțiile Equal și 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"

Compararea și raportarea editărilor

DiffOperation suprascrie Equals, GetHashCode și ToString, astfel încât editările pot fi comparate pentru egalitate sau scrise în jurnale și ieșiri de test fără cod suplimentar de conversie.

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

Sfaturi și cele mai bune practici

  • DiffOperation este imuabil și implementează IEquatable<DiffOperation> — folosește Equals pentru a compara două editări în loc de egalitatea de referință.
  • Localizează prefixul comun cu FindCommonStartParts mai întâi, apoi transmite lungimea acestuia în suprasarcina startIndex a lui FindCommonEndParts pentru a evita ca un prefix comun scurt să fie numărat de două ori ca parte a sufixului.
  • Folosește AssemblySourceText și AssemblyDestinationText pentru a verifica că o secvență de valori DiffOperation revine exact la textul original și revizuit înainte de a te baza pe ea în altă parte.
  • Tratează rulările Operation.Equal ca operații fără efect atunci când redai o diferență vizuală și evidențiază doar rulările Delete și Insert.
  • Acest motor compară diferențele de text, nu documentele direct — extrage textul pe care vrei să îl compari (de exemplu, dintr-o pagină sau document) înainte de a genera o diferență.

Probleme comune

ProblemăCauzăRemediere
Ieșirea AssemblySourceText / AssemblyDestinationText nu se potrivește cu originaleleLista diffs este incompletă sau intrările sale DiffOperation sunt în afara ordiniiIncludeți fiecare modificare în secvență, în ordinea originală în care au avut loc modificările
FindCommonEndParts returnează un rezultat neașteptat pe șiruri scurte și similareCăutarea sufixului comun suprapune textul deja potrivit de FindCommonStartPartsTransmiteți lungimea returnată de FindCommonStartParts ca argument startIndex
Equals returnează false pentru editări care par identiceValorile Text diferă prin spații albe sau prin majuscule/minusculeNormalizați textul (trim / case-fold) înainte de a construi valorile DiffOperation pe care intenționați să le comparați
Ieșirea diff pare zgomotoasă sau inutil fragmentatăSecvențele brute DiffOperation nu sunt încă canonicalizateRulați secvența prin trecerea de optimizare descrisă în Optimizarea Diff

FAQ

Ce compară motorul Diff?

Compară secvențe de text și produce o succesiune de valori DiffOperation care descriu editările — text neschimbat, șters sau inserat — necesare pentru a transforma un șir în altul.

Ce tipuri de editări suportă Operation?

Trei: Equal pentru text neschimbat, Delete pentru text eliminat din sursă și Insert pentru text adăugat în destinație.

Cum verific dacă două editări sunt identice?

Apelați Equals pe o instanță DiffOperation, sau comparați direct proprietățile Operation și Text ale acesteia.

Pot să recuperez textul original și revizuit dintr-un diff?

Da — transmiteți lista de valori DiffOperation către DiffUtils.AssemblySourceText pentru textul original și DiffUtils.AssemblyDestinationText pentru textul revizuit.

Această pagină acoperă îmbinarea sau curățarea unui diff?

Nu — canonicalizarea unui diff brut (îmbinarea secvențelor adiacente, alunecarea editărilor peste egalități) este acoperită separat în Optimizare Diff.


API Reference Rezumat

Clasă / MetodăDescriere:
OperationEnum care clasifică o editare ca Equal, Delete sau Insert
DiffOperationO singură editare: un Operation asociat cu Text la care se aplică
DiffOperation.OperationValoarea Operation pentru această editare
DiffOperation.TextSecvența de text la care se aplică această editare
DiffOperation.EqualsCompară două editări pentru egalitate după Operation și Text
DiffOperation.ToStringRedă o editare ca șir pentru jurnalizare sau afișare
DiffUtilsClasă statică de ajutor cu utilități pentru diferențierea textului
DiffUtils.FindCommonStartPartsGăsește prefixul comun al două șiruri
DiffUtils.FindCommonEndPartsGăsește sufixul comun al două șiruri, opțional începând de la un index
DiffUtils.AssemblySourceTextReconstruiește textul original dintr-o listă de valori DiffOperation
DiffUtils.AssemblyDestinationTextReasamblează textul revizuit dintr-o listă de valori DiffOperation

Vezi și:

 Română