Ruby undefined方法`map' for CSV :: open#<< (NoMethodError)

时间:2012-07-04 18:33:28

标签: ruby csv

这可行,但由于某种原因,逗号丢失了。 data作为

插入
GAURISH SHARMA
97
69
69
975
PASS

将每个值写在新行中。我想知道逗号在哪里?或者那些必须手动插入?


我正在尝试使用以下代码编写哈希值

CSV.open("resultdata.csv", "a") do |csv|    
  h.each do |key, value|
    csv << value
  end
end

以下是h哈希

的内容
{:name=>"GAURISH SHARMA",
 :ca=>"97",
 :cb=>"69",
 :ba_lab=>"69",
 :bb_lab=>"69",
 :grand_total=>"975",
 :result=>"PASS"}

此代码看起来正确但在运行此代码时,会生成以下错误:

/home/gaurish/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/csv.rb:1729:in `<<': undefined method `map' for "GAURISH SHARMA":String (NoMethodError)
    from /home/gaurish/Dropbox/code/projects/ra/result.rb:35:in `block (2 levels) in <main>'
    from /home/gaurish/Dropbox/code/projects/ra/result.rb:34:in `each'
    from /home/gaurish/Dropbox/code/projects/ra/result.rb:34:in `block in <main>'
    from /home/gaurish/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/csv.rb:1354:in `open'
    from /home/gaurish/Dropbox/code/projects/ra/result.rb:33:in `<main>'

知道这里有什么问题吗?

3 个答案:

答案 0 :(得分:11)

执行csv << value时,您正在将字符串写入文件。 CSV库可以将数组写入文件(以某种形式)。从散列中获取包含所有值的数组的最佳方法是使用values方法btw。所以:

require 'csv'
h = {:name=>"GAURISH SHARMA",
 :ca=>"97",
 :cb=>"69",
 :ba_lab=>"69",
 :bb_lab=>"69",
 :grand_total=>"975",
 :result=>"PASS"}

CSV.open("resultdata.csv", "a") do |csv|    
  csv << h.values
end

resultdata.csv看起来像

GAURISH SHARMA,97,69,69,69,975,PASS

答案 1 :(得分:10)

value放入数组中,如下所示:

CSV.open("resultdata.csv", "a") do |csv|    
  h.each do |key, value|
    csv << [value]
  end
end

<强> EDITED

每次使用csv << ["foo"]时,它都会在新行中插入“foo”。但如果你做csv << ["foo", "foo", "foo"],你会在同一行得到3个“foo”,用逗号分隔。

知道这一点,首先尝试将所有值存储在数组中,然后使用csv << your_values_array。这将解决您的问题。

答案 2 :(得分:2)

csv << value尝试执行的操作是将新的附加到<<)到CSV上。因此,它期望value是一个数组,而不是一个字符串,数组中的每个元素都对应于要追加的行的列/字段。因此,以下内容应该有效:

CSV.open("resultdata.csv", "a") do |csv|    
  h.each do |key, value|
    csv << [value]
  end
end