การเปรียบเทียบเอกสาร

การเปรียบเทียบเอกสาร

การเปรียบเทียบเอกสาร

คู่มือนี้แสดงวิธีการเปรียบเทียบข้อความสองชุดและสร้างลำดับของการแก้ไขระหว่างพวกมันโดยใช้ Aspose.PDF FOSS text-diff engine สำหรับ .NET. จุดเริ่มต้นสำหรับโมเดลการเปรียบเทียบนี้คือ DiffOperation, การแก้ไขเดียวที่มีแท็กด้วย Operation (Equal, Delete, หรือ Insert), พร้อมกับ DiffUtils คลาสช่วยเหลือสำหรับการหาข้อความที่เหมือนกันและการประกอบ diff กลับเป็นข้อความต้นฉบับและข้อความปลายทางอีกครั้ง. ขั้นตอนการเพิ่มประสิทธิภาพแยกต่างหาก, ที่อธิบายใน การเพิ่มประสิทธิภาพ Diff, ทำให้ผลลัพธ์ diff ดิบที่สร้างขึ้นในลักษณะนี้เป็นมาตรฐานก่อนที่จะแสดงหรือใช้งาน.


โมเดล Diff: การทำงานและ DiffOperation

Operation คือ enum ที่จัดประเภทการแก้ไขแต่ละรายการใน diff: Equal ระบุช่วงข้อความที่ไม่เปลี่ยนแปลง, Delete ระบุช่วงที่ถูกลบจากต้นฉบับ, และ Insert ระบุช่วงที่เพิ่มในปลายทาง. DiffOperation จับคู่ค่าของ Operation กับ Text ที่มันใช้, และทำการ implement 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 คือคลาสช่วยเหลือแบบ static ที่ใช้โดยเครื่องมือ diff เพื่อค้นหาคำนำหน้าและส่วนต่อท้ายที่ร่วมกันของสองสตริงก่อนที่ส่วนกลางที่แตกต่างจะถูกทำ diff. FindCommonStartParts ค้นหาคำนำหน้าที่ร่วม, และ FindCommonEndParts ค้นหาส่วนต่อท้ายที่ร่วม; การ overload ของ 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 เป็น immutable และ implements IEquatable<DiffOperation> — ใช้ Equals เพื่อเปรียบเทียบการแก้ไขสองรายการแทนการเปรียบเทียบอ้างอิง.
  • ค้นหาพรีฟิกซ์ที่เหมือนกันด้วย FindCommonStartParts ก่อน, จากนั้นส่งความยาวของมันเข้าไปใน overload startIndex ของ FindCommonEndParts เพื่อหลีกเลี่ยงการนับพรีฟิกซ์ที่สั้นซ้ำสองครั้งเป็นส่วนหนึ่งของซัฟฟิกซ์.
  • ใช้ AssemblySourceText และ AssemblyDestinationText เพื่อตรวจสอบว่าลำดับของค่า DiffOperation สามารถ round-trips ไปยังข้อความต้นฉบับและข้อความที่แก้ไขใหม่ได้อย่างตรงกันก่อนที่คุณจะพึ่งพาในที่อื่น.
  • ถือการทำงานของ Operation.Equal เป็น no-op เมื่อแสดง diff แบบภาพ, และไฮไลต์เฉพาะการทำงานของ Delete และ Insert เท่านั้น.
  • เครื่องมือนี้ทำการเปรียบเทียบความแตกต่างของข้อความ ไม่ใช่เอกสารโดยตรง — ให้ดึงข้อความที่คุณต้องการเปรียบเทียบ (เช่น จากหน้าเว็บหรือเอกสาร) ก่อนที่จะสร้างการเปรียบเทียบความแตกต่าง.

ปัญหาทั่วไป

ปัญหาสาเหตุแก้ไข
ผลลัพธ์ของ AssemblySourceText / AssemblyDestinationText ไม่ตรงกับต้นฉบับรายการ diffs ไม่ครบหรือรายการ DiffOperation ของมันเรียงลำดับผิดรวมการแก้ไขทุกขั้นตอนในลำดับตามลำดับเดิมที่เกิดขึ้น
FindCommonEndParts คืนค่าที่ไม่คาดคิดเมื่อใช้งานกับสตริงสั้นที่คล้ายกันการค้นหาส่วนต่อท้ายที่เหมือนกันทับซ้อนกับข้อความที่ FindCommonStartParts จับคู่แล้วส่งความยาวที่ FindCommonStartParts คืนค่าเป็นอาร์กิวเมนต์ startIndex
Equals คืนค่า false สำหรับการแก้ไขที่ดูเหมือนเหมือนกันค่าของ Text แตกต่างกันด้วยช่องว่างหรือการใช้ตัวพิมพ์ใหญ่/เล็กทำให้ข้อความเป็นมาตรฐาน (ตัดช่องว่าง / แปลงเป็นตัวพิมพ์เดียว) ก่อนสร้างค่าของ DiffOperation ที่คุณต้องการเปรียบเทียบ
ผลลัพธ์การเปรียบเทียบดูรกหรือแยกส่วนโดยไม่จำเป็นลำดับ DiffOperation ดิบยังไม่ได้ทำให้เป็นมาตรฐานรันลำดับผ่านขั้นตอนการเพิ่มประสิทธิภาพที่อธิบายไว้ใน การเพิ่มประสิทธิภาพ Diff

FAQ

เครื่องมือ Diff เปรียบเทียบอะไร?

มันเปรียบเทียบชุดของข้อความและสร้างลำดับของค่า DiffOperation ที่อธิบายการแก้ไข — ข้อความที่ไม่เปลี่ยนแปลง, ถูกลบ, หรือถูกแทรก — ที่จำเป็นเพื่อเปลี่ยนสตริงหนึ่งให้เป็นอีกสตริงหนึ่ง.

ประเภทการแก้ไขใดที่ Operation รองรับ?

สามประเภท: Equal สำหรับข้อความที่ไม่เปลี่ยนแปลง, Delete สำหรับข้อความที่ถูกลบจากแหล่งที่มา, และ Insert สำหรับข้อความที่เพิ่มในปลายทาง.

ฉันจะตรวจสอบว่าการแก้ไขสองรายการเหมือนกันหรือไม่อย่างไร?

เรียก Equals บนอินสแตนซ์ของ DiffOperation, หรือเปรียบเทียบคุณสมบัติ Operation และ Text ของมันโดยตรง.

ฉันสามารถดึงข้อความต้นฉบับและข้อความที่แก้ไขจาก diff ได้หรือไม่?

ใช่ — ส่งรายการค่า DiffOperation ไปยัง DiffUtils.AssemblySourceText สำหรับข้อความต้นฉบับและ DiffUtils.AssemblyDestinationText สำหรับข้อความที่แก้ไข.

หน้านี้ครอบคลุมการผสานหรือทำความสะอาด diff หรือไม่?

No — การทำให้ diff ดิบเป็นมาตรฐาน (การรวมรันที่อยู่ติดกัน, การเลื่อนการแก้ไขผ่านส่วนที่เท่ากัน) จะอธิบายแยกต่างหากใน การเพิ่มประสิทธิภาพ Diff.


API Reference สรุป

คลาส / เมธอดคำอธิบาย
OperationEnum ที่จำแนกการแก้ไขเป็น Equal, Delete หรือ Insert
DiffOperationการแก้ไขเดี่ยว: Operation ที่จับคู่กับ Text ที่มันนำไปใช้
DiffOperation.Operationค่า Operation สำหรับการแก้ไขนี้
DiffOperation.Textส่วนของข้อความที่การแก้ไขนี้ใช้กับ
DiffOperation.Equalsเปรียบเทียบการแก้ไขสองรายการเพื่อความเท่ากันโดย Operation และ Text
DiffOperation.ToStringแสดงการแก้ไขเป็นสตริงเพื่อบันทึกหรือแสดงผล
DiffUtilsคลาสช่วยเหลือแบบสแตติกที่มียูทิลิตี้สำหรับการเปรียบเทียบข้อความ
DiffUtils.FindCommonStartPartsค้นหาคำนำหน้าที่เหมือนกันระหว่างสองสตริง
DiffUtils.FindCommonEndPartsค้นหาคำต่อท้ายที่เหมือนกันระหว่างสองสตริง โดยสามารถเริ่มจากดัชนีที่กำหนดได้
DiffUtils.AssemblySourceTextประกอบข้อความต้นฉบับใหม่จากรายการของค่า DiffOperation
DiffUtils.AssemblyDestinationTextประกอบข้อความที่แก้ไขใหม่จากรายการของค่า DiffOperation

ดูเพิ่มเติม

 ภาษาไทย