2009-12-19 36 views
17

Tôi muốn hiển thị sự khác biệt giữa hai khối văn bản. Thay vì so sánh các dòng văn bản hoặc các ký tự riêng lẻ, tôi muốn chỉ so sánh các từ được phân tách bằng các ký tự được chỉ định ('\ n', '', '\ t' chẳng hạn). Lý do chính của tôi cho điều này là khối văn bản mà tôi sẽ so sánh thường không có nhiều ngắt dòng trong đó và so sánh chữ cái có thể khó theo dõi.Làm thế nào để hiển thị sự khác biệt từ bằng cách sử dụng C#?

Tôi đã xem qua các số O(ND) logic in C# sau đây để so sánh các dòng và ký tự, nhưng tôi không biết cách sửa đổi nó để so sánh các từ.

Ngoài ra, tôi muốn theo dõi các dấu phân cách giữa các từ và đảm bảo chúng được bao gồm trong phần khác. Vì vậy, nếu một không gian được thay thế bởi một trở lại khó khăn, tôi muốn rằng để đi lên như một sự khác biệt.

Tôi đang sử dụng Asp.Net (C#) để hiển thị toàn bộ khối văn bản bao gồm văn bản gốc đã xóa và văn bản mới được thêm vào (cả hai sẽ được đánh dấu để cho biết chúng đã bị xóa/thêm). Một giải pháp làm việc với những công nghệ đó sẽ được đánh giá cao.

Bất kỳ lời khuyên nào về cách thực hiện điều này được đánh giá cao.

+0

Vui chơi. Một đồng nghiệp của tôi đã làm điều này cho một bản phát hành của dòng sản phẩm hàng đầu của chúng tôi. Anh ta đã bị thách thức bởi nó.Và ông đã sử dụng một số giấy tờ lý thuyết để hướng dẫn công việc của mình ... nắm toàn bộ thời gian về chất lượng của văn bản. –

Trả lời

15

Microsoft đã phát hành một dự án khác trên CodePlex cho phép bạn thực hiện các từ, ký tự và các khác biệt về dòng. Nó được cấp phép theo Giấy phép Công cộng của Microsoft (Ms-PL).

https://github.com/mmanela/diffplex

+2

DiffPlex cho phép bạn xác định một hàm tùy chỉnh cho cách phân vùng văn bản trước khi nó được phân biệt. Bạn có thể sử dụng phương pháp: DiffResult CreateCustomDiffs (chuỗi oldText, chuỗi newText, bool ignoreWhiteSpace, Func chunker) nơi chunker nói DiffPlex là đơn vị nguyên tử nào so sánh với nhau. –

+0

Xin chào Jim, tôi đang tìm giải pháp tương tự, muốn biết quan điểm của bạn nếu sử dụng diffplex như được giải quyết vấn đề của bạn? –

+0

Có vẻ như tôi đã sử dụng http://www.codeproject.com/Articles/11454/A-word-wise-HTML-text-compare-and-merge-engine cho giải pháp của mình. Tôi không nhớ tại sao tôi sử dụng nó trên diffplex, tbh. Giải pháp này kết thúc tốt đẹp các từ đã xóa và được thêm vào trong các thẻ html được xác định, cho phép bạn tạo kiểu theo ý muốn. –

1

Khác với một vài tối ưu hóa chung, nếu bạn cần bao gồm dấu phân tách trong so sánh, bạn thực chất đang thực hiện một ký tự bằng so sánh nhân vật với dấu ngắt. Mặc dù bạn có thể sử dụng O (ND) mà bạn đã liên kết, bạn sẽ thực hiện nhiều thay đổi đối với nó như bạn về cơ bản sẽ viết của riêng bạn.

Vấn đề chính với so sánh khác biệt là tìm sự tiếp tục (nếu tôi xóa một từ, nhưng để phần còn lại giống nhau).

Nếu bạn muốn sử dụng mã bắt đầu bằng ví dụ và không viết các ký tự đã xóa, nếu có các ký tự được thay thế trong cùng một vị trí, không xuất kết quả này. Sau đó, bạn cần tính toán chuỗi liên tục dài nhất của từ "đã thay đổi", đánh dấu chuỗi và đầu ra này.

Xin lỗi rằng không có nhiều câu trả lời, nhưng đối với vấn đề này, câu trả lời về cơ bản là viết và điều chỉnh hàm.

0

Vâng String.Split với '\ n', '' và '\ t' vì các ký tự phân tách sẽ trả về cho bạn một mảng từ trong khối văn bản của bạn.

Sau đó, bạn có thể so sánh từng mảng để biết sự khác biệt. Một so sánh đơn giản 1: 1 sẽ cho bạn biết nếu bất kỳ từ nào đã được thay đổi. So sánh:

hello world how are you 

và:

hello there how are you 

sẽ cung cấp cho bạn rằng world và thay đổi để there.

Những gì nó sẽ không cho bạn biết là nếu các từ đã được chèn vào hoặc bị xóa và bạn vẫn cần phải phân tích cú pháp khối ký tự theo ký tự để xem có bất kỳ ký tự phân cách nào đã được thay đổi hay không.

+1

Tôi sợ rằng String.Split cho các khối văn bản lớn sẽ không hiệu quả. –

Các vấn đề liên quan