mysql - Ruby CSV 读取多行字段

标签 mysql ruby csv fastercsv

我从 SQL 导出表和查询,其中一些字段是多行的。

读取 CSV 的 Ruby (1.9+) 方式似乎是:

require 'csv'

CSV.foreach("exported_mysql_table.csv", {:headers=>true}) do |row|
    puts row
end

如果我的数据是这样的,那么效果很好:

"id","name","email","potato"
1,"Bob","<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="cfada0ad8fada0ade1ada0ad" rel="noreferrer noopener nofollow">[email protected]</a>","omnomnom"
2,"Charlie","<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="23404b425163404b42510d404c4e" rel="noreferrer noopener nofollow">[email protected]</a>","andcheese"
4,"Doug","<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="34505d53534d5074505d535851401a575b59" rel="noreferrer noopener nofollow">[email protected]</a>","usemeltattack"

(第一行是标题/属性)

但是如果我有:

"id","name","address","email","potato"
1,"Bob","--- 
- 101 Cottage row
- Lovely Village
- \"\"
","<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="e98b868ba98b868bc78b868b" rel="noreferrer noopener nofollow">[email protected]</a>","omnomnom"
2,"Charlie","--- 
- 102 Flame Street
- \"\"
- \"\"
","<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="9efdf6ffecdefdf6ffecb0fdf1f3" rel="noreferrer noopener nofollow">[email protected]</a>","andcheese"
4,"Doug","--- 
- 103 Dark Cave
- Next to some geo dude
- So many bats
","<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="aacec3cdcdd3ceeacec3cdc6cfde84c9c5c7" rel="noreferrer noopener nofollow">[email protected]</a>","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)

这似乎是因为该行的末尾没有闭合引号,因为它跨越了几行。

(我尝试了“FasterCSV”,从 ruby​​ 1.9 开始,该 gem 变成了“csv”)

最佳答案

您的问题不是多行而是格式错误的 CSV。

替换行结束后的 \" 和结束空格,如下所示:

require 'csv' 

ml = %q{"id","name","address","email","potato" 
1,"Bob","---  
- 101 Cottage row 
- Lovely Village 
- \"\" 
","<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="dfbdb0bd9fbdb0bdf1bdb0bd" rel="noreferrer noopener nofollow">[email protected]</a>","omnomnom" 
2,"Charlie","---  
- 102 Flame Street 
- \"\" 
- \"\" 
","<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="aecdc6cfdceecdc6cfdc80cdc1c3" rel="noreferrer noopener nofollow">[email protected]</a>","andcheese" 
4,"Doug","---  
- 103 Dark Cave 
- Next to some geo dude 
- So many bats 
","<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="aecac7c9c9d7caeecac7c9c2cbda80cdc1c3" rel="noreferrer noopener nofollow">[email protected]</a>","usemeltattack"}

ml.gsub!(/\" \n/,"\"\n").gsub!(/\\\"/,"__")

CSV.parse(ml, {:headers=>true}) do |row|
  puts row
end

这给出:

"id","name","address","email","potato"
1,"Bob","---  
- 101 Cottage row 
- Lovely Village 
- ____
","<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="d2b0bdb092b0bdb0fcb0bdb0" rel="noreferrer noopener nofollow">[email protected]</a>","omnomnom"
etc

如果您无法控制提供 CSV 的程序,则必须打开文件、读取内容、进行替换,然后解析 CSV。我在这里使用 __ 但您可以使用其他不冲突的字符。

关于mysql - Ruby CSV 读取多行字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12915383/

相关文章:

php - HTML 表单下拉选择问题

mysql内连接返回空值,

ruby-on-rails - simple_form 中的嵌套属性返回质量分配错误

mysql - Ruby 中特定键等效时特定值的总和

r - Spark Dataframe 中的重复列

python - 如何在python中动态生成mysql ON DUPLICATE UPDATE

python - 从 .rtf 文件导入数据时使用 int() 时出错

mysql - 如何对一列或多列相等的行进行分组?

mysql - 选择列最大的数据

ruby-on-rails - Ruby(和 Rails)嵌套模块语法