Ответ 1
CSV поддерживает "конвертеры", которые мы обычно можем использовать для массажа содержимого поля, прежде чем он вернется к нашему коду. Например, это можно использовать для strip дополнительных пробелов для всех полей в строке.
К сожалению, преобразователи загораются после того, как строка разделена на поля, и во время этого шага, что 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|