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"]

何故ですか?1行で正しく機能するCSVオブジェクトを取得できないのはなぜCSV.newですか?

4

2 に答える 2

4

ドキュメントに記載されているように、文字列はファイル(つまり、StringIO)の内容であるかのように扱われるため、他のIOソースと同じように文字列を読み取る必要があります。

ヘッダーを明示的に設定する場合は、:headersパラメーターとして配列を渡します。

于 2012-11-29T18:13:29.337 に答える
2

1回の呼び出しでこれを行う方法はないようですが、独自のカスタムメソッドを使用して簡単に修正できます。

与えられた:

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