Ruby CSV читает строки и числа из MySQL, экспортированных CSV
Я экспортировал таблицы и запросы из SQL.
Рубин (1.9+) способ чтения CSV выглядит так:
require 'csv'
CSV.foreach("exported_mysql_table.csv", {:headers=>true}) do |row|
puts row
end
Что прекрасно работает, если ваши данные такие:
"name","email","potato"
"Bob","bob@bob.bob","omnomnom"
"Charlie","char@char.com","andcheese"
"Doug","diggyd@diglet.com","usemeltattack"
Работает нормально (первая строка - заголовок, атрибуты). Однако, если данные похожи на это:
"id","name","email","potato"
1,"Bob","bob@bob.bob","omnomnom"
2,"Charlie","char@char.com","andcheese"
4,"Doug","diggyd@diglet.com","usemeltattack"
Тогда мы получаем ошибку:
.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/csv.rb:1894:in `block (2 levels) in shift': Missing or stray quote in line 2 (CSV::MalformedCSVError)
Я думаю, это потому, что идентификатор хранится в виде числа, а не строки, и поэтому не имеет кавычек, и синтаксический анализатор CSV ожидает, что все записи имеют кавычки. В идеале я хотел бы прочитать "Боб" как строку и 1 как число (и запихать его в хэш хэшей)
(Пробовал 'FasterCSV', этот камень стал 'csv' с ruby 1.9)
РЕДАКТИРОВАТЬ:
Было отмечено, что пример работал нормально (сумасшедший), искал не в том месте, это была ошибка с многострочными полями, вопрос перенесен в Ruby CSV для чтения многострочных полей
1 ответ
Используя предоставленные вами данные, я не могу воспроизвести это.
1.9.3p194 :001 > require 'csv'
=> true
1.9.3p194 :002 > CSV.foreach("test.txt", {:headers => true}) { |row| puts row }
1,Bob,bob@bob.bob,omnomnom
2,Charlie,char@char.com,andcheese
4,Doug,diggyd@diglet.com,usemeltattack
=> nil
Единственное различие, которое я вижу между нашими средами, заключается в том, что вы используете rbenv, а я использую RVM. Я также проверил это на другой машине с ruby 1.9.3-p194. Соответствует ли введенный вами ввод тому, что находится в вашем CSV?