xxj*_*jnn 1 ruby mysql csv fastercsv
我从SQL导出表和查询,其中一些字段是多行的.
Ruby(1.9+)读取CSV的方式似乎是:
require 'csv'
CSV.foreach("exported_mysql_table.csv", {:headers=>true}) do |row|
puts row
end
Run Code Online (Sandbox Code Playgroud)
如果我的数据是这样的,那么效果很好:
"id","name","email","potato"
1,"Bob","bob@bob.bob","omnomnom"
2,"Charlie","char@char.com","andcheese"
4,"Doug","diggyd@diglet.com","usemeltattack"
Run Code Online (Sandbox Code Playgroud)
(第一行是标题/属性)
但如果我有:
"id","name","address","email","potato"
1,"Bob","---
- 101 Cottage row
- Lovely Village
- \"\"
","bob@bob.bob","omnomnom"
2,"Charlie","---
- 102 Flame Street
- \"\"
- \"\"
","char@char.com","andcheese"
4,"Doug","---
- 103 Dark Cave
- Next to some geo dude
- So many bats
","diggyd@diglet.com","usemeltattack"
Run Code Online (Sandbox Code Playgroud)
然后我得到错误:
.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)
Run Code Online (Sandbox Code Playgroud)
这似乎是因为该行的末尾没有近距离引用,因为它跨越了几行.
(我试过'FasterCSV',因为ruby 1.9,宝石变成了'csv')
您的问题不是多行但是格式错误的CSV.
\"在这样的行结束后替换和结束空格:
require 'csv'
ml = %q{"id","name","address","email","potato"
1,"Bob","---
- 101 Cottage row
- Lovely Village
- \"\"
","bob@bob.bob","omnomnom"
2,"Charlie","---
- 102 Flame Street
- \"\"
- \"\"
","char@char.com","andcheese"
4,"Doug","---
- 103 Dark Cave
- Next to some geo dude
- So many bats
","diggyd@diglet.com","usemeltattack"}
ml.gsub!(/\" \n/,"\"\n").gsub!(/\\\"/,"__")
CSV.parse(ml, {:headers=>true}) do |row|
puts row
end
Run Code Online (Sandbox Code Playgroud)
这给出了:
"id","name","address","email","potato"
1,"Bob","---
- 101 Cottage row
- Lovely Village
- ____
","bob@bob.bob","omnomnom"
etc
Run Code Online (Sandbox Code Playgroud)
如果您无法控制提供CSV的程序,则必须打开文件,读取内容,执行替换,然后解析CSV.我__在这里使用,但你可以使用其他非冲突的字符.
| 归档时间: |
|
| 查看次数: |
4424 次 |
| 最近记录: |