Comparaison de documents

Comparaison de documents

Comparaison de documents

Ce guide montre comment comparer deux passages de texte et produire la séquence de modifications entre eux en utilisant le moteur de diff de texte FOSS Aspose.PDF pour .NET. Le point d’entrée de ce modèle de comparaison est DiffOperation, une modification unique marquée avec un Operation (Equal, Delete, ou Insert), ainsi qu’avec le DiffUtils classe d’assistance pour localiser le texte commun et réassembler un diff dans son texte source et destination. Un passage d’optimisation séparé, décrit dans Diff Optimisation, canonise la sortie brute du diff produite de cette façon avant qu’elle ne soit rendue ou appliquée.


Le modèle de diff : opération et DiffOperation

Operation est l’énumération qui classe chaque modification dans un diff : Equal indique une portion de texte qui n’est pas modifiée, Delete indique une portion supprimée de la source, et Insert indique une portion ajoutée dans la destination. DiffOperation associe une valeur Operation au Text auquel elle s’applique, et implémente IEquatable<DiffOperation> afin que deux modifications puissent être comparées pour l’égalité.

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"

Localisation du texte commun avec DiffUtils

DiffUtils est une classe d’assistance statique utilisée par le moteur de diff pour trouver le préfixe et le suffixe communs partagés par deux chaînes avant que la section médiane différente ne soit diffée. FindCommonStartParts localise le préfixe commun, et FindCommonEndParts localise le suffixe commun; une surcharge de FindCommonEndParts accepte un startIndex afin que la recherche du suffixe puisse être limitée au texte qui suit un préfixe déjà localisé.

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

Réassembler le texte à partir d’un diff

Une fois qu’un diff est exprimé comme une séquence de valeurs DiffOperation, DiffUtils peut reconstruire chaque côté de la comparaison: AssemblySourceText reconstruit le texte original à partir des passages Equal et Delete, et AssemblyDestinationText reconstruit le texte révisé à partir des passages Equal et 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"

Comparer et rapporter les modifications

DiffOperation surcharge Equals, GetHashCode et ToString, de sorte que les modifications peuvent être comparées pour l’égalité ou écrites dans les journaux et la sortie de test sans code de conversion supplémentaire.

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

Conseils et bonnes pratiques

  • DiffOperation est immuable et implémente IEquatable<DiffOperation> — utilisez Equals pour comparer deux modifications plutôt que l’égalité de référence.
  • Localisez d’abord le préfixe commun avec FindCommonStartParts, puis transmettez sa longueur à la surcharge startIndex de FindCommonEndParts afin d’éviter qu’un préfixe commun court ne soit compté deux fois comme partie du suffixe.
  • Utilisez AssemblySourceText et AssemblyDestinationText pour vérifier qu’une séquence de valeurs DiffOperation revient exactement au texte original et révisé avant de l’utiliser ailleurs.
  • Considérez les passages Operation.Equal comme des no-ops lors du rendu d’un diff visuel, et ne mettez en évidence que les passages Delete et Insert.
  • Ce moteur effectue des diff sur le texte, pas directement sur les documents — extrayez le texte que vous souhaitez comparer (par exemple, depuis une page ou un document) avant de créer un diff.

Problèmes courants

ProblèmeCauseCorrection
La sortie de AssemblySourceText / AssemblyDestinationText ne correspond pas aux originauxLa liste diffs est incomplète ou ses entrées DiffOperation ne sont pas dans le bon ordreIncluez chaque modification dans la séquence, dans l’ordre original des modifications
FindCommonEndParts renvoie un résultat inattendu sur des chaînes courtes et similairesLa recherche de suffixe commun chevauche du texte déjà trouvé par FindCommonStartPartsPassez la longueur renvoyée par FindCommonStartParts comme argument startIndex
Equals renvoie false pour des modifications qui semblent identiquesLes valeurs Text diffèrent par les espaces ou la casseNormalisez le texte (trim / case-fold) avant de construire les valeurs DiffOperation que vous souhaitez comparer
La sortie du diff semble bruyante ou inutilement fragmentéeLes séquences DiffOperation brutes ne sont pas encore canoniséesExécutez la séquence à travers le passage d’optimisation décrit dans Optimisation du diff

FAQ

Que compare le moteur Diff?

Il compare des séquences de texte et produit une séquence de valeurs DiffOperation décrivant les modifications — texte inchangé, supprimé ou inséré — nécessaires pour transformer une chaîne en une autre.

Quels types de modifications Operation prend en charge?

Trois: Equal pour le texte inchangé, Delete pour le texte supprimé de la source, et Insert pour le texte ajouté dans la destination.

Comment vérifier si deux modifications sont identiques?

Appelez Equals sur une instance DiffOperation, ou comparez directement ses propriétés Operation et Text.

Puis-je récupérer le texte original et révisé à partir d’un diff?

Oui — passez la liste des valeurs DiffOperation à DiffUtils.AssemblySourceText pour le texte original et DiffUtils.AssemblyDestinationText pour le texte révisé.

Cette page couvre-t-elle la fusion ou le nettoyage d’un diff?

Non — la canonisation d’un diff brut (fusion des blocs adjacents, décalage des modifications à travers les égalités) est traitée séparément dans Diff Optimisation.


API Reference Résumé

Classe / MéthodeDescription
OperationEnum classifiant une modification comme Equal, Delete ou Insert
DiffOperationUne seule modification : un Operation associé au Text auquel il s’applique
DiffOperation.OperationLa valeur Operation pour cette modification
DiffOperation.TextLe texte concerné par cette modification
DiffOperation.EqualsCompare deux modifications pour vérifier leur égalité selon Operation et Text
DiffOperation.ToStringRend une modification sous forme de chaîne pour la journalisation ou l’affichage
DiffUtilsClasse d’aide statique avec des utilitaires de diff de texte
DiffUtils.FindCommonStartPartsTrouve le préfixe commun partagé par deux chaînes
DiffUtils.FindCommonEndPartsTrouve le suffixe commun partagé par deux chaînes, éventuellement à partir d’un indice
DiffUtils.AssemblySourceTextReconstitue le texte original à partir d’une liste de valeurs DiffOperation
DiffUtils.AssemblyDestinationTextReconstitue le texte révisé à partir d’une liste de valeurs DiffOperation

Voir aussi

 Français