0

SQLからテーブルとクエリをエクスポートしました。

csvを読み取るルビー(1.9+)の方法は次のようになります。

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」を試しましたが、そのgemはruby 1.9以降「csv」になりました)

編集:

例が正常に機能している(derp)、間違った場所を探している、複数行のフィールドでエラーが発生した、質問がRubyCSVに移動された複数行のフィールドを読み取ることが指摘されました

4

1 に答える 1

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を使用していることです。また、ruby1.9.3-p194を使用している別のマシンでこれを確認しました。指定した入力は、csvの内容と完全に一致していますか?

于 2012-10-16T12:26:19.690 に答える