【问题标题】:Ruby undefined method `map' for CSV::open#<< (NoMethodError)CSV::open#<< (NoMethodError) 的 Ruby 未定义方法“map”
【发布时间】:2012-07-04 18:33:28
【问题描述】:

这可行,但由于某种原因缺少逗号。 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>'

知道这里有什么问题吗?

【问题讨论】:

    标签: ruby csv


    【解决方案1】:

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

    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
    

    【讨论】:

    • 如果我们想要与问题相同的结果怎么办? GAURISH SHARMA 97 69 69 975 PASS 我的意思是如果我希望每个字符串都换行。
    【解决方案2】:

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

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

    已编辑

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

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

    【讨论】:

    • 您好,感谢您的回复,它有效,但并没有完全解决问题。现在缺少逗号。我已经用详细信息更新了原始问题
    • 在第二个例子中,each 循环是完全没有必要的,你可以通过 csv &lt;&lt; h.values 来获得相同的结果。
    • 完全正确 :) 我来重构它,但估计为时已晚。
    【解决方案3】:

    csv &lt;&lt; value 试图做的是将 (&lt;&lt;) 一个新的 附加到 CSV 上。因此,它期望value 是一个数组,而不是一个字符串,数组中的每个元素对应于被附加的行的列/字段。因此,以下应该有效:

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

    【讨论】:

    • 您好,感谢您的回复,它有效,但并没有完全解决问题。现在缺少逗号。我已经用详细信息更新了原始问题
    猜你喜欢
    • 1970-01-01
    • 2018-05-16
    • 2023-03-06
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多