Ruby CSV从MySQL导出的csv中读取字符串和数字

时间:2012-10-16 12:11:42

标签: sql ruby csv fastercsv

我从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)

我认为这是因为id存储为数字而不是字符串,因此没有引号,并且csv解析器期望所有条目都有引号。理想情况下,我想将“Bob”视为字符串,将1视为数字(并将其写入散列哈希)

(尝试'FasterCSV',宝石自红宝石1.9起成为'csv')

编辑:

有人指出该示例工作正常(derp),查找错误的地方,多行字段出错,问题移至Ruby CSV read multiline fields

1 个答案:

答案 0 :(得分: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中的输入完全匹配?