比较ruby中的两个文本文件

时间:2017-05-04 09:24:36

标签: python ruby-on-rails ruby compare readfile

我有两个文本文件file1.txt和file2.txt。我想找到文件的差异,这将突出显示相等,插入和删除文本。最终目标是创建一个html文件,该文件将以不同的颜色和样式突出显示文本(相同,插入和删除文本)。

FILE1.TXT

I am testing this ruby code for printing the file diff.

FILE2.TXT

I am testing this code for printing the file diff. 

我正在使用此代码

 doc1 = File.open('file1.txt').read    
 doc2 = open('file2.txt').read
 final_doc =  Diffy::Diff.new(doc1, doc2).each_chunk.to_a

输出结果为:

-I am testing this ruby code for printing the file diff.
+I am testing this code for printing the file diff.

但是,我需要输出类似于以下格式。

equal:
  I am testing this
insertion:
  ruby
equal:
  code for printing the file diff.

在python中有一个difflib可以实现它,但我还没有在Ruby中找到这样的功能。

1 个答案:

答案 0 :(得分:0)

我发现Ruby中有一些不同的库可用于执行“区分”,但它们更专注于逐行检查。我创建了一些代码,用于比较几个相对较短的字符串并显示差异,这是一种快速技巧,如果在突出显示已删除部分的内容中高亮显示已删除部分时并不太重要,则该技巧非常有用-要做到这一点,只需要多考虑一下算法即可。但是这段代码一次只能为少量文本提供奇迹。

关键是,像进行任何语言处理一样,正确地设置标记。您不能只逐字处理一个字符串。确实,最好的方法是首先递归地循环遍历,并将每个标记与文本中的位置相关联,然后使用该位置进行分析,但是下面的这种方法快速简便。

  def self.change_differences(text1,text2) #oldtext, newtext
    result = ""
    tokens = text2.split(/(?<=[?.!,])/) #Positive look behind regexp.
    for token in tokens
      if text1.sub!(token,"") #Yes it contained it.
        result += "<span class='diffsame'>" + token + "</span>"
      else
        result += "<span class='diffadd'>" + token + "</span>"
      end
    end
    tokens = text1.split(/(?<=[?.!,])/) #Positive look behind regexp.
    for token in tokens
      result += "<span class='diffremove'>"+token+"</span>"
    end
    return result
  end

来源:me