Ruby / Rails,使用引号之间的换行解析CSV

时间:2015-10-04 09:05:45

标签: ruby-on-rails ruby csv

有没有办法告诉CSV对象引号之间的换行符不是行分隔符?

我的CSV文件是:

"a","b","c"
1,"some
text with line break",21
2,"blah",4

我的代码是:

CSV.foreach(file_path, headers: true) do |row|
  puts row
end

我希望它只返回两行,但它返回三行。

3 个答案:

答案 0 :(得分:4)

您(错误地)根据打印行数判断行数。它返回两个。去图:

[4] pry(main)> CSV.foreach('example.csv', headers: true).map{ |x| x }
=> [
 #<CSV::Row "a":"1" "b":"some\ntext with line break" "c":"21">,
 #<CSV::Row "a":"2" "b":"blah" "c":"4">
]

您的代码输出三行,因为您正在打印行并按原样打印换行符。这使得它看起来好像有一行变成了两行。 以同样的方式思考,我会说您的源CSV包含4(4!)行。这不是真的。

注意 :你在Ruby 2.2中使用.map(&:itself),我使用了更便携的等价物。

答案 1 :(得分:1)

目前,您可以将标头设置为true,然后显示您的数据row.to_hash。例如:

CSV.foreach("/home/akbar/text.csv", headers: true) do |row|
  puts row.to_hash
end

结果是:

1.9.3p194 :034 > CSV.foreach("/home/akbar/text.csv", headers: true) do |x|
1.9.3p194 :035 >     puts x.to_hash
1.9.3p194 :036?>   end
{"a"=>"1", "b"=>"some\ntext with line break", "c"=>"21"}
{"a"=>"2", "b"=>"blah", "c"=>"4"}

有关详细信息,请参阅“ruby-on-rails-import-data-from-a-csv-file”。

答案 2 :(得分:0)

对于在尝试阅读任何行中带有换行符的CSV文件时遇到麻烦的人,只需使用row_sep: '\r\n'

阅读
data = CSV.read('your_file.csv', row_sep: "\r\n")