So sánh tài liệu

So sánh tài liệu

Hướng dẫn này cho thấy cách so sánh hai đoạn văn bản và tạo ra chuỗi các chỉnh sửa giữa chúng bằng cách sử dụng động cơ text-diff mã nguồn mở Aspose.PDF cho .NET. Điểm vào cho mô hình so sánh này là DiffOperation, một chỉnh sửa đơn lẻ được gắn thẻ bằng một Operation (Equal, Delete, hoặc Insert), cùng với DiffUtils lớp trợ giúp để xác định văn bản chung và lắp lại diff về văn bản nguồn và đích. Một vòng tối ưu hoá riêng, được mô tả trong Tối ưu hoá Diff, chuẩn hoá đầu ra diff thô được tạo ra theo cách này trước khi nó được hiển thị hoặc áp dụng.


Mô hình Diff: Hoạt động và DiffOperation

Operation là enum phân loại mỗi chỉnh sửa trong một diff: Equal đánh dấu một đoạn văn bản không thay đổi, Delete đánh dấu một đoạn bị loại bỏ khỏi nguồn, và Insert đánh dấu một đoạn được thêm vào đích. DiffOperation ghép một giá trị Operation với Text mà nó áp dụng, và triển khai IEquatable<DiffOperation> để hai chỉnh sửa có thể so sánh về tính bằng nhau.

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"

Xác định Văn bản Chung với DiffUtils

DiffUtils là một lớp trợ giúp tĩnh được engine diff sử dụng để tìm tiền tố và hậu tố chung mà hai chuỗi chia sẻ trước khi phần giữa khác nhau được diff. FindCommonStartParts xác định tiền tố chung, và FindCommonEndParts xác định hậu tố chung; một overload của FindCommonEndParts chấp nhận một startIndex để việc tìm hậu tố có thể bị giới hạn trong văn bản theo sau một tiền tố đã được xác định.

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

Ghép lại Văn bản từ một Diff

Khi một diff được biểu diễn dưới dạng một chuỗi các giá trị DiffOperation, DiffUtils có thể tái tạo bất kỳ phía nào của so sánh: AssemblySourceText xây dựng lại văn bản gốc từ các lần chạy Equal và Delete, và AssemblyDestinationText xây dựng lại văn bản đã sửa đổi từ các lần chạy Equal và 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"

So sánh và Báo cáo các chỉnh sửa

DiffOperation ghi đè Equals, GetHashCode, và ToString, vì vậy các chỉnh sửa có thể được so sánh về sự bằng nhau hoặc ghi vào log và đầu ra kiểm thử mà không cần mã chuyển đổi bổ sung.

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

Mẹo và Thực tiễn Tốt nhất

  • DiffOperation là bất biến và triển khai IEquatable<DiffOperation> — hãy sử dụng Equals để so sánh hai chỉnh sửa thay vì so sánh bằng tham chiếu.
  • Đầu tiên xác định tiền tố chung bằng FindCommonStartParts, sau đó truyền độ dài của nó vào overload startIndex của FindCommonEndParts để tránh việc một tiền tố chung ngắn bị đếm đôi như một phần của hậu tố.
  • Sử dụng AssemblySourceText và AssemblyDestinationText để xác minh một chuỗi các giá trị DiffOperation có thể quay trở lại văn bản gốc và đã sửa đổi một cách chính xác trước khi bạn dựa vào chúng ở nơi khác.
  • Xem các lần chạy Operation.Equal như không thực hiện gì khi hiển thị diff trực quan, và chỉ tô sáng các lần chạy Delete và Insert.
  • Công cụ này so sánh sự khác biệt của văn bản, không phải tài liệu trực tiếp — hãy trích xuất văn bản bạn muốn so sánh (ví dụ, từ một trang hoặc tài liệu) trước khi tạo diff.

Các vấn đề thường gặp

Vấn đềNguyên nhânSửa
AssemblySourceText / AssemblyDestinationText đầu ra không khớp với bản gốcDanh sách diffs không đầy đủ hoặc các mục DiffOperation của nó không theo thứ tựBao gồm mọi chỉnh sửa trong chuỗi, theo thứ tự ban đầu mà các chỉnh sửa đã xảy ra
FindCommonEndParts trả về kết quả không mong đợi trên các chuỗi ngắn, tương tựTìm kiếm hậu tố chung trùng lặp văn bản đã được FindCommonStartParts khớpTruyền độ dài được FindCommonStartParts trả về làm đối số startIndex
Equals trả về false cho các chỉnh sửa có vẻ giống nhauCác giá trị Text khác nhau về khoảng trắng hoặc chữ hoa/chữ thườngChuẩn hoá văn bản (cắt / chuẩn hoá chữ hoa/chữ thường) trước khi tạo các giá trị DiffOperation mà bạn dự định so sánh
Kết quả diff trông nhiễu hoặc bị chia thành các phần không cần thiếtCác chuỗi DiffOperation thô chưa được chuẩn hoáChạy chuỗi qua bước tối ưu hoá được mô tả trong Tối ưu hoá Diff

FAQ

Công cụ Diff so sánh những gì?

Nó so sánh các đoạn văn bản và tạo ra một chuỗi các giá trị DiffOperation mô tả các chỉnh sửa — văn bản không thay đổi, bị xóa hoặc được chèn — cần thiết để biến một chuỗi thành chuỗi khác.

Các loại chỉnh sửa nào mà Operation hỗ trợ?

Ba loại: Equal cho văn bản không thay đổi, Delete cho văn bản bị loại bỏ khỏi nguồn, và Insert cho văn bản được thêm vào đích.

Làm sao tôi kiểm tra xem hai chỉnh sửa có giống nhau không?

Gọi Equals trên một thể hiện DiffOperation, hoặc so sánh trực tiếp các thuộc tính Operation và Text của nó.

Tôi có thể lấy lại văn bản gốc và văn bản đã sửa đổi từ một diff không?

Có — truyền danh sách các giá trị DiffOperation cho DiffUtils.AssemblySourceText để lấy văn bản gốc và DiffUtils.AssemblyDestinationText để lấy văn bản đã sửa đổi.

Trang này có đề cập đến việc hợp nhất hoặc làm sạch một diff không?

Không — việc chuẩn hoá một diff thô (gộp các run liền kề, trượt các chỉnh sửa qua các phần bằng nhau) được đề cập riêng trong Tối ưu hoá Diff.


API Reference Tóm tắt

Lớp / Phương thứcMô tả
OperationEnum phân loại một chỉnh sửa là Equal, Delete, hoặc Insert
DiffOperationMột chỉnh sửa duy nhất: một Operation kết hợp với Text mà nó áp dụng
DiffOperation.OperationGiá trị Operation cho chỉnh sửa này
DiffOperation.TextĐoạn văn bản mà chỉnh sửa này áp dụng
DiffOperation.EqualsSo sánh hai chỉnh sửa để xác định tính bằng nhau bằng Operation và Text
DiffOperation.ToStringKết xuất một chỉnh sửa thành chuỗi để ghi log hoặc hiển thị
DiffUtilsLớp trợ giúp tĩnh với các tiện ích text-diffing
DiffUtils.FindCommonStartPartsTìm tiền tố chung của hai chuỗi
DiffUtils.FindCommonEndPartsTìm hậu tố chung của hai chuỗi, tùy chọn bắt đầu từ một chỉ số
DiffUtils.AssemblySourceTextGhép lại văn bản gốc từ danh sách các giá trị DiffOperation
DiffUtils.AssemblyDestinationTextGhép lại văn bản đã chỉnh sửa từ danh sách các giá trị DiffOperation

Xem thêm

 Tiếng Việt