0

我有一个 csv,我想根据另一行 [数字] 的输入来处理行 [报告] 的实例。

Report,Number,Name,Date
INC AMT %,12345678,ACME INC,10/30/2012
INC AMT %,12345678,ACME INC,10/31/2012
OUT AMT %,12345678,ACME INC,10/31/2012
# shortened for brevity

我的代码块如下所示:

require 'CSV'

module AlertHash
  @alert_hash = {}
  CSV.foreach("alerts.csv") do |row|
    report, number = row
    next if number == "Number"
    @alert_hash[number] = report
  end

  def self.report(number)
  @alert_hash[number]
  end

end

puts "Alert: " + AlertHash.report("12345678")
# OUTPUT => Alert: OUT AMT %
# DESIRED OUTPUT => Alert: INC AMT %, OUT AMT % 

我已经能够处理每个数字的最后一个 [report]stack。但是,我想要的输出是捕获给定行 [number] 的所有报告。有人可以给我一些关于如何做到这一点的指示吗?也许我以错误的方式处理这个问题。

4

2 回答 2

1

这个说法:

@alert_hash[number] = report

将覆盖任何给定数字索引的任何先前值,因此您只保留最后一个。这就是为什么你OUT只获得价值。如果要收集给定数字的所有行,请使用数组:

@alert_hash[number] ||= [] # initialize array if required
@alert_hash[number] << report # add value

然后在您的report方法中连接它们:

@alert_hash[number].join(", ")

这会给你:

Alert: INC AMT %, INC AMT %, OUT AMT %

不确定您实际上想要实现什么,但这解释了您的代码的当前行为。

于 2012-11-19T21:39:07.847 回答
0

@Thilo,显然评论部分不允许我显示代码修改。如前所述,uniq! 方法从数组中删除任何重复的元素。这正是我一直在寻找的。

require 'csv'

module AlertHash
  @alert_hash = {}
  CSV.foreach("../data.csv") do |row|
    report, number = row
    next if number == "Number"
    @alert_hash[number] ||= [] # initialize array if required
    @alert_hash[number] << report # add value
  end

  def self.report(number)
    @alert_hash[number].uniq!.join(", ") # concatenate reports to @alert_hash array
  end
end

puts "Alert: " + AlertHash.report("12345678")
# OUTPUT => Alert: INC AMT %, OUT AMT % 
于 2012-11-20T05:02:14.137 回答