【发布时间】:2013-05-02 17:50:02
【问题描述】:
我有两个结构相同的 CSV 文件,理想情况下应该有相同的数据。
我想使用 Ruby 比较它们中的数据,并想知道我们是否已经有相同的 Ruby 函数。
【问题讨论】:
我有两个结构相同的 CSV 文件,理想情况下应该有相同的数据。
我想使用 Ruby 比较它们中的数据,并想知道我们是否已经有相同的 Ruby 函数。
【问题讨论】:
如果你想检查文件是否相同,你可以简单地使用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)
【讨论】:
正如 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 中读取正确的行。
file1_lines = CSV.read("file1.csv") file2_lines = CSV.read("file2.csv") file1_lines - file2_lines ...您会看到不同之处 - 比逐行执行更快、更清晰。