CSV 支持“转换器”,我们通常可以使用它来处理字段的内容,然后再将其传递回我们的代码。例如,这可用于去除一行中所有字段上的额外空格。
不幸的是,转换器在将行拆分为字段后触发,并且在该步骤中 CSV 对嵌入的引号感到生气,因此我们必须在“行读取”步骤和“将行解析为字段”之间“ 步。
这是我的示例 CSV 文件:
ID,Name,Country
173,"Yukihiro \"The Ruby Guy\" Matsumoto","Japan"
保留您的CSV.foreach方法,这是我在不让 CSV 发疯的情况下解析它的示例代码:
require 'csv'
require 'pp'
header = []
File.foreach('test.csv') do |csv_line|
row = CSV.parse(csv_line.gsub('\"', '""')).first
if header.empty?
header = row.map(&:to_sym)
next
end
row = Hash[header.zip(row)]
pp row
puts row[:Name]
end
以及由此产生的哈希值和名称值:
{:ID=>"173", :Name=>"Yukihiro \"The Ruby Guy\" Matsumoto", :Country=>"Japan"}
Yukihiro "The Ruby Guy" Matsumoto
我假设您想要一个哈希值,因为您指定了:headers标志:
CSV.foreach('my.csv', headers: true, header_converters: :symbol) do |row|