2010-01-09 27 views
7

Tất cả các công cụ khác mà tôi đã tìm thấy chỉ là so sánh từng dòng thay vì char bằng char. Có thư viện nào cung cấp chi tiết về các chuỗi đơn không? Có lẽ cũng có một sự khác biệt về tỷ lệ phần trăm, mặc dù tôi đoán có những chức năng riêng biệt cho điều đó?khác nhau cho các dòng đơn

+0

Đây không phải là bản sao của http://stackoverflow.com/questions/1721738/using-diff-or-anything-else-to-get-character-level-diff giữa các tập tin văn bản? –

Trả lời

5

này diffs thuật toán word-by-word:

http://github.com/paulgb/simplediff

sẵn bằng Python và PHP. Nó thậm chí có thể nhổ ra đầu ra định dạng HTML bằng cách sử dụng các thẻ <ins><del>.

+0

Tốt, nhưng khoảng trắng cũng quan trọng. Một tab được thay thế bởi một khoảng trống sẽ là một sự khác biệt không được chọn bởi điều này. –

+0

Mã nguồn trông đủ đơn giản. Bạn có thể dễ dàng thay đổi nó để tách trên chuỗi rỗng thay vì khoảng trắng để bạn có thể khác biệt từng ký tự. – slebetman

+0

Thực ra cái này hoạt động tuyệt vời, bằng cách truyền các chuỗi trực tiếp đến diff() thay vì thông qua stringDiff(). Hoạt động độc đáo trên một char bởi char cơ sở, bởi vì chuỗi là trình tự trong python. Và đầu ra của hàm cũng dễ làm việc. Tôi tự hỏi về chi phí của việc tìm kiếm chuỗi con phổ biến lớn nhất mặc dù, khi mỗi mục chỉ là một char ... mặc dù tôi có thể hiểu sai mã ... –

3

Những gì bạn có thể thử là chia cả hai chuỗi ký tự thành ký tự thành các dòng và sau đó bạn có thể sử dụng khác biệt trên đó. Đó là một hack bẩn, nhưng ít nhất nó sẽ làm việc và khá dễ dàng để thực hiện.

Hoặc bạn có thể chia chuỗi thành một danh sách các ký tự trong Python và sử dụng difflib. Kiểm tra Python difflib reference

+0

Tôi nghĩ về điều này, và nó trông giống như tùy chọn "tốt nhất" cho đến nay. Tôi cũng đã xem xét xem xét các công cụ khác biệt của dòng và cố gắng làm cho nó xử lý ký tự như là dòng thay vì ... nhưng tôi nghĩ rằng tôi muốn kiểm tra đầu tiên. –

+0

Điều đó có thể được thực hiện dễ dàng 'diff <(cat file1 | tr "" "\ n") <(cat fil2 | tr "" "\ n") 'nhưng vấn đề là đầu ra được định dạng kém. Tốt hơn nhiều để làm 'wdiff file1 file2' Nhờ câu trả lời của @Michael Williamson. –

+0

Đây là phiên bản ký tự theo từng ký tự 'diff <(cat a1 | sed 's /./ \ 0 \ n /' g) <(cat a2 | sed 's /./ \ 0 \ n /' g) ' –

4

Tôi đã tìm kiếm một cái gì đó tương tự gần đây và đã xem qua wdiff. Nó hoạt động trên các từ, không phải ký tự, nhưng nó gần với những gì bạn đang tìm kiếm?

+0

Tốt, nhưng khoảng trắng cũng quan trọng. Một tab được thay thế bởi một khoảng trống sẽ là một sự khác biệt không được chọn bởi điều này (nếu chia cho khoảng trắng). –

+1

wdiff dường như bị bỏ rơi từ năm 1994. nó hoạt động, chủ yếu. – lhf

+0

@lhf, Nó bị bỏ rơi hay đơn giản là không còn nhiều cải tiến nữa? –

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