【问题标题】:Ruby CSV: Comparison of columns (from two csvs), write new column in oneRuby CSV:列比较(来自两个 csv),在一个中写入新列
【发布时间】: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


【解决方案1】:

headers 方法应该可以帮助您匹配列——从那里开始解析并将修改后的数据写回文件。

【讨论】:

    【解决方案2】:

    解决了。

    data1 = CSV.read('data1.csv')
    data2 = CSV.read('data2.csv')
    
    data2.each do |data2|
        data1.each do |data1|
            if (data1[5] == data2[4])
                data1[1] = data2[1]
                puts "Change made!"
                puts data1
            end
        end
    end
    
    File.open('referenced.csv','w'){ |f| f << data1.map(&:to_csv).join("")}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-19
      • 2017-05-28
      • 1970-01-01
      • 2021-04-27
      • 1970-01-01
      • 2021-09-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多