📘

WIP 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 に準じる形になっているみたいですね。

https://www.ietf.org/rfc/rfc4180.txt

強制的に "" で囲むようにする

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'

この場合は " が含まれていても ' でくくられないのでご注意を。

GitHubで編集を提案

Discussion