5

我正在尝试创建一个新的 CSV 对象,其中只有标题行,但在我调用之前不会设置标题read()

[32] pry(main)> c = CSV.new("Keyword,Index,Page,Index in Page,Type,Title,URL", :headers => :first_row, :write_headers => true, :return_headers => true)
=> <#CSV io_type:StringIO encoding:UTF-8 lineno:0 col_sep:"," row_sep:"\n" quote_char:"\"" headers:true>
[33] pry(main)> c.headers
=> true
[34] pry(main)> c.read
=> #<CSV::Table mode:col_or_row row_count:1>
[35] pry(main)> c.headers
=> ["Keyword", "Index", "Page", "Index in Page", "Type", "Title", "URL"]

这是为什么?为什么我不能用我的单行得到一个正常工作的 CSV 对象CSV.new

4

2 回答 2

4

正如文档将告诉您的那样,它将字符串视为文件的内容(即 StringIO),因此您仍然必须像读取任何其他 IO 源一样读取字符串。

如果要显式设置标头,请将数组作为:headers参数传递。

于 2012-11-29T18:13:29.337 回答
2

似乎没有一种方法可以在一次调用中执行此操作,但您可以使用自己的自定义方法轻松解决此问题:

鉴于:

def new_csv(headers, data)
  csv = CSV.new(data, headers: headers, write_headers: true, return_headers: true)
  csv.read
  csv
end

您可以将其用作:

csv = new_csv("Header 1, Header 2", "abc,def") 
=> <#CSV io_type:StringIO encoding:UTF-8 lineno:1 col_sep:"," row_sep:"\n" quote_char:"\"" headers:["abc", "def"]>

csv.headers
=> ["Header 1", "Header 2"]

希望有帮助。

于 2012-11-29T19:27:20.093 回答