השוואת מסמכים

השוואת מסמכים

השוואת מסמכים

מדריך זה מציג כיצד להשוות בין שני רצפים של טקסט וליצור את סדרת העריכות ביניהם באמצעות מנוע ה-text-diff הקוד הפתוח Aspose.PDF עבור .NET. נקודת הכניסה למודל ההשוואה הזה היא DiffOperation, עריכה בודדת המתויגת ב- Operation (Equal, Delete, או Insert), יחד עם ה- DiffUtils מחלקת עזר לאיתור טקסט משותף והרכבת diff מחדש חזרה לטקסט המקור והיעד. מעבר אופטימיזציה נפרד, המתואר ב- אופטימיזציית diff, ממיר לפורמט קנוני פלט diff גולמי שנוצר בדרך זו לפני שהוא מוצג או מיושם.


מודל ה-Diff: פעולה ו-DiffOperation

Operation הוא ה-enum שמסווג כל עריכה ב-diff: Equal מסמן רצף טקסט שלא השתנה, Delete מסמן רצף שהוסר מהמקור, ו-Insert מסמן רצף שהתווסף ביעד. DiffOperation משזז ערך Operation עם ה-Text אליו הוא מוחל, ומממש IEquatable<DiffOperation> כדי ששתי עריכות ניתן להשוות לשוויון.

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"

איתור טקסט משותף עם DiffUtils

DiffUtils היא מחלקת עזר סטטית המשמשת את מנוע ה-diff למציאת הקידומת והסיומת המשותפות לשתי מחרוזות לפני שמקטע האמצע השונה מבוצע diff. FindCommonStartParts מאתרת את הקידומת המשותפת, ו-FindCommonEndParts מאתרת את הסיומת המשותפת; גרסה מותאמת של FindCommonEndParts מקבלת startIndex כך שחיפוש הסיומת יכול להיות מוגבל לטקסט שמגיע אחרי קידומת שכבר נמצאה.

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

הרכבה מחדש של טקסט מ-Diff

ברגע שה-diff מתבטא כרצף של ערכי DiffOperation, DiffUtils יכול לשחזר את שני צידי ההשוואה: AssemblySourceText בונה מחדש את הטקסט המקורי מהרצים Equal ו-Delete, ו-AssemblyDestinationText בונה מחדש את הטקסט המתוקן מהרצים Equal ו-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"

השוואת עריכות ודיווח

DiffOperation מחליף את Equals, GetHashCode ו-ToString, כך שניתן להשוות עריכות לשוויון או לכתוב אותן ליומנים ולפלט מבחן ללא קוד המרה נוסף.

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

טיפים ושיטות עבודה מומלצות

  • DiffOperation הוא בלתי ניתן לשינוי ומיישם את IEquatable<DiffOperation> — השתמש ב-Equals כדי להשוות שני עריכות במקום השוואת זהות בהתייחסות.
  • אתר את הקידומת המשותפת עם FindCommonStartParts תחילה, ואז העבר את אורכה ל-overload של startIndex ב-FindCommonEndParts כדי למנוע קידומת משותפת קצרה שתיספר פעמיים כחלק מהסיומת.
  • השתמש ב-AssemblySourceText ו-AssemblyDestinationText כדי לאמת שרצף של ערכי DiffOperation משחזר את הטקסט המקורי והמתוקן בדיוק לפני שאתה סומך עליו במקומות אחרים.
  • התייחס להרצות Operation.Equal כלא-פעולות בעת רינדור diff חזותי, והדגש רק את הרצות Delete ו-Insert.
  • המנוע הזה משווה טקסט, ולא מסמכים ישירות — יש לחלץ את הטקסט שברצונך להשוות (למשל, מדף או מסמך) לפני יצירת ההשוואה.

בעיות נפוצות

בעיהסיבהתיקון
הפלט של AssemblySourceText / AssemblyDestinationText אינו תואם למקורותרשימת diffs אינה שלמה או שהערכים DiffOperation שלה אינם בסדרכלול כל עריכה ברצף, בסדר המקורי שבו התרחשו העריכות
FindCommonEndParts מחזיר תוצאה בלתי צפויה על מחרוזות קצרות ודומותחיפוש הסיומת המשותפת חופף טקסט שכבר תואם על ידי FindCommonStartPartsהעבר את האורך שמוחזר על ידי FindCommonStartParts כארגומנט startIndex
Equals מחזיר false עבור עריכות שנראות זהותהערכים של Text שונים ברווחים או ברישיותנרמל את הטקסט (חיתוך / המרת רישיות) לפני בניית ערכי DiffOperation שאתה מתכוון להשוות
פלט Diff נראה רועש או מפוצל באופן מיותררצפי DiffOperation גולמיים עדיין לא קנוניקלייםהפעל את הרצף דרך מסע האופטימיזציה המתואר ב אופטימיזציית Diff

FAQ

מה משווה מנוע ה-Diff?

הוא משווה רצפי טקסט ומייצר סדרה של ערכי DiffOperation המתארים את העריכות — טקסט שלא השתנה, נמחק, או נוסף — הדרושים כדי להפוך מחרוזת אחת לאחרת.

אילו סוגי עריכה Operation תומך?

שלושה: Equal לטקסט שלא השתנה, Delete לטקסט שהוסר מהמקור, ו-Insert לטקסט שנוסף ביעד.

איך אני בודק האם שתי עריכות זהות?

הפעל את Equals על מופע של DiffOperation, או השווה ישירות את המאפיינים Operation ו-Text שלו.

האם אני יכול לקבל בחזרה את הטקסט המקורי והמעודכן מה-diff?

כן — העבר את רשימת ערכי DiffOperation ל-DiffUtils.AssemblySourceText עבור הטקסט המקורי ו-DiffUtils.AssemblyDestinationText עבור הטקסט המעודכן.

האם דף זה מכסה מיזוג או ניקוי של diff?

לא — קנוניקליזציה של diff גולמי (מיזוג ריצות סמוכות, החלקת עריכות על פני שוויונות) מכוסה בנפרד ב אופטימיזציית Diff.


API Reference סיכום

מחלקה / מתודהתיאור
OperationEnum שמסווג עריכה כ-Equal, Delete או Insert
DiffOperationעריכה בודדת: Operation שמזוהה עם ה-Text אליו היא חלה
DiffOperation.Operationהערך של Operation עבור עריכה זו
DiffOperation.Textהקטע של הטקסט שאליו חלה עריכה זו
DiffOperation.Equalsמשווה שני עריכות לשוויון על פי Operation ו-Text
DiffOperation.ToStringמציג עריכה כמחרוזת לצורכי רישום או הצגה
DiffUtilsמחלקת עזר סטטית עם כלי diff של טקסט
DiffUtils.FindCommonStartPartsמאתרת את הקידומת המשותפת לשתי מחרוזות
DiffUtils.FindCommonEndPartsמאתרת את הסיומת המשותפת לשתי מחרוזות, עם אפשרות להתחיל מאינדקס
DiffUtils.AssemblySourceTextמרכיב מחדש את הטקסט המקורי מרשימה של ערכי DiffOperation
DiffUtils.AssemblyDestinationTextמרכיב מחדש את הטקסט המתוקן מרשימה של ערכי DiffOperation

ראה גם

 עברית