2013-05-02 69 views
0

我有两个具有相同结构的CSV文件,理想情况下应具有相同的数据。如何比较两个CSV文件中的数据

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

+0

您可以通过使用[CSV类](http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV.html)开始使用CSV文件,至少(尽管另外还有[其他CSV](http://fastercsv.rubyforge.org/)[工具](https://github.com/tilo/smarter_csv)。) – summea 2013-05-02 17:52:17

回答

1

由于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进行迭代,但这里有两个。

另外,请注意,其中一个列表可能比另一个长,但这应该让您开始。

+0

您可以使用'file1_lines。 each_with_index {| line,index | ...}并用它从file2中读取正确的行。 – 2013-05-02 19:13:07

+0

同意。我喜欢这两个文件之间的对称性。个人偏好,可能(永远不会使用一个单独的列表)。 – Martin 2013-05-02 19:17:06

+0

如果file2与file1完全相同(除了附加行),则不起作用。人们必须使用这两个文件的最大行数。 – 2013-05-02 19:34:30

3

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

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

如果你想看到的不同,你可能要使用diffy

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

它产生可以很好地格式化为HTML的diff-like输出:

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