2

一部のフィールドが複数行である 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","bob@bob.bob","omnomnom"
2,"Charlie","char@char.com","andcheese"
4,"Doug","diggyd@diglet.com","usemeltattack"

(最初の行はヘッダー/属性です)

しかし、私が持っている場合:

"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"

次に、エラーが発生します。

.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から「csv」になりました)

4

1 に答える 1

5

あなたの問題は複数行ではなく、不正な形式の 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

これは与える:

"id","name","address","email","potato"
1,"Bob","---  
- 101 Cottage row 
- Lovely Village 
- ____
","bob@bob.bob","omnomnom"
etc

CSV を配信するプログラムを制御できない場合は、ファイルを開いて内容を読み取り、置換を行ってから CSV を解析する必要があります。ここで使用__しますが、競合しない他の文字を使用できます。

于 2012-10-16T17:02:44.633 に答える