【问题标题】:How to compare data in two CSV files如何比较两个 CSV 文件中的数据
【发布时间】:2013-05-02 17:50:02
【问题描述】:

我有两个结构相同的 CSV 文件,理想情况下应该有相同的数据。

我想使用 Ruby 比较它们中的数据,并想知道我们是否已经有相同的 Ruby 函数。

【问题讨论】:

标签: ruby csv compare


【解决方案1】:

如果你想检查文件是否相同,你可以简单地使用identical?,它是compare_file的别名:

FileUtils.identical?('file1.csv', 'file2.csv')

如果您想查看可能需要使用diffy 的差异:

gem install diffy
puts Diffy::Diff.new('file1.csv', 'file2.csv',  :source => 'files')

它产生类似 diff 的输出,可以很好地格式化为 HTML:

puts Diffy::Diff.new('file1.csv', 'file2.csv',  :source => 'files').to_s(:html_simple)

【讨论】:

    【解决方案2】:

    正如 Summea 所说,查看 CSV 类。

    然后使用:

    #Will store each line of each file as an array of fields (so an array of arrays).
    file1_lines = CSV.read("file1.csv")
    file2_lines = CSV.read("file2.csv")
    
    for i in 0..file1_lines.size
      if (file1_lines[i] == file2_lines[i]
        puts "Same #{file1_lines[i]}"
      else
        puts "#{file1_lines[i]} != #{file2_lines[i]}"
      end
    end
    

    请注意,在 Ruby 中使用 for 是非常罕见的。您通常在集合上使用each 进行迭代,但这里有两个。

    另外,请注意其中一个列表可能比另一个长,但这应该可以帮助您入门。

    【讨论】:

    • 您可以使用 file1_lines.each_with_index {|line, index| ... } 并使用它从 file2 中读取正确的行。
    • 同意。我喜欢这两个文件之间的对称性。个人喜好,可能(永远不会将 for 与唯一列表一起使用)。
    • 如果 file2 除了额外的行之外与 file1 相同,则不会工作。必须使用两个文件的最大行数。
    • 非常感谢大家,尤其是。马丁!我使用了两个文件大小中的最大值,并将其用作 For 循环的上限
    • ...或者,更简单地说,您可以使用 file1_lines = CSV.read("file1.csv") file2_lines = CSV.read("file2.csv") file1_lines - file2_lines ...您会看到不同之处 - 比逐行执行更快、更清晰。
    猜你喜欢
    • 2016-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多