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 % 

各番号の最後の [レポート] スタックを処理できました。ただし、希望する出力は、特定の行 [番号] のすべてのレポートをキャプチャすることです。誰かがこれを行う方法についていくつかの指針を教えてもらえますか? たぶん、私はこの問題に間違った方法で取り組んでいます。

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 に答える