【发布时间】:2015-10-16 17:38:39
【问题描述】:
我已经搜索过,但没有找到解决这个特殊难题的方法。我有两个有时与同一事物相关的 CSV 数据文件。这是一个例子:
CSV1(500 行):
date,reference,amount,type
10/13/2015,,1510.40,sale
10/13/2015,,312.90,sale
10/14/2015,,928.50,sale
10/15/2015,,820.25,sale
10/12/2015,,702.70,credit
CSV2(20000 行):
reference,date,amount
243534985,10/13/2015,312.90
345893745,10/15/2015,820.25
086234523,10/14/2015,928.50
458235832,10/13/2015,1510.40
我的目标是将CSV2中的日期和金额与CSV1中的日期和金额进行匹配,并将CSV2中的引用写入相应行的引用列。
这是一个简化的视图,因为 CSV2 实际上包含更多列 - 这些只是相关的列,所以理想情况下我想通过标题名称或索引来引用它们?
这是我尝试过的,但我有点卡住了。
require 'csv'
data1 = {}
data2 = {}
CSV.foreach("data1.csv", :headers => true, :header_converters => :symbol, :converters => :all) do |row|
data1[row.fields[0]] = Hash[row.headers[1..-1].zip(row.fields[1..-1])]
end
CSV.foreach("data2.csv", :headers => true, :header_converters => :symbol, :converters => :all) do |row|
data2[row.fields[0]] = Hash[row.headers[1..-1].zip(row.fields[1..-1])]
end
data1.each do |data1_row|
data2.each do |data2_row|
if (data1_row['comparitive'] == data2_row['comparitive'])
puts data1_row['identifier'] + data2_row['column_thats_important_and_wanted']
end
end
end
结果:
22:in `[]': no implicit conversion of String into Integer (TypeError)
我也试过了:
CSV.foreach('data2.csv') do |data2|
CSV.foreach('data1.csv') do |data1|
if (data1[3] == data2[4])
data1[1] << data2[1]
puts "Change made!"
else
puts "nothing changed."
end
end
end
然而,这与 if 语句中的任何内容都不匹配,所以可能不是正确的方法?
【问题讨论】:
-
当然有道理,但是……你的代码在哪里?
-
欢迎来到 Stack Overflow。请参阅“How to Ask”。我确定您已尝试解决此问题,因此请显示演示您的问题所需的最少代码和数据。否则,我们将不得不猜测并与您一起玩 20 个问题,以了解您尝试了什么,这浪费了我们所有的时间。直接回答你的问题,没有什么神奇的方法可以比较两列,这就是为什么我们写代码,向计算机描述如何做到这一点。
-
我很抱歉 - 我什至还没写完任何有用的东西就发布了这个问题。我仍在试图弄清楚如何解析,但是跨 csvs 比较的方法仍然让我望而却步。我已经设法对其进行了修改,因此我只比较每个列中的一列,然后尝试从第二列中抓取另一列并放入第一列。
标签: ruby csv cross-reference