csvで残りを全部最後の列に入れる

標準のcsvパーサーでcsv読み込むのに、例えばこんなかんじで書いてると

require 'csv'
CSV.foreach('test.csv') do |row|
  Hoge.create(:a => row[0], :b => row[1], :c => row[2])
end

例えば以下のようなデータ自体にカンマを含むレコードがあると、レコードの列の数が合わないのでCSV::MalformedCSVErrorになる。2行目は3列目に"fff, ggg"を代入したい。

aaa, bbb, ccc
ddd, eee, fff, ggg

元データにカンマが入ってるのにクオートされたりしていないのが諸悪の根源なんだけど、とりあえず元データには手を付けずに読みたい。
できればrowに渡されたところで小細工したいけど、rowに渡される前にエラーになるので、力技で自前で行を読んで切ってつなげてみる。

open('test.csv') do |file|
  file.each do |line|
    a, b, *c_array = line.split(',').map(&:strip)
    c = c_array.join(', ')
    Hoge.create(:a => a, :b => b, :c => c)
  end
end

カンマでsplitして空白stripしてjoinしてるので、厳密に言うとカンマ前後の空白が完全に再現できていないのだけど、今回はその辺はどっちでもよいものだったので簡単に切ってつなげた。厳密にやろうとすると頭からカンマの位置を順番に切り出さないといけないと思う。


(追記)もっと簡単な方法があった。
続csvで残りを全部最後の列に入れる - 城陽人の本棚