📘
Ruby で CSV の項目をすべてダブルクオートで囲むようにする
Ruby の csv ライブラリでは以下の条件に当てはまる場合に要素が "" で囲まれるようになっています。
-
"が含まれている場合 -
,が含まれている場合 -
\nが含まれている場合 -
空文字列の場合
require "csv"
require "stringio"
output = StringIO.new
csv = CSV.new(output)
# これは "" で囲まれない
csv << [42, "mami", nil, 3.14]
# これは "" で囲まれる
csv << ["homu,mami", 'mado"', "", "mami\nmado"]
puts output.string
42,mami,,3.14
"homu,mami","mado""","","mami
mado"
このあたりは CSV の規格である rfc4180 に準じる形になっているみたいですね。
強制的に "" で囲むようにする
Ruby の csv ライブラリだと force_quotes: オプションですべての要素を "" でくくるようにすることができます。
require "csv"
require "stringio"
output = StringIO.new
csv = CSV.new(output, force_quotes: true)
# これも "" でくくられるようになる
csv << [42, "mami", nil, 3.14]
csv << ["homu,mami", 'mado"', "", "mami\nmado"]
puts output.string
"42","mami","","3.14"
"homu,mami","mado""","","mami
mado"
"" の有無を区別したくないような場合に便利です。
ちなみに "" の文字は quote_char で指定できたりもします。
require "csv"
require "stringio"
output = StringIO.new
csv = CSV.new(output, quote_char: "'")
# 'mado 以外は '' でくくられるようになる
csv << ["homu,mami", 'mado"', "", "mami\nmado"]
puts output.string
'homu,mami',mado",'','mami
mado'
この場合は " が含まれていても ' でくくられないのでご注意を。
Discussion