Skip to content

Instantly share code, notes, and snippets.

@yowasou
Created April 7, 2021 13:27
Show Gist options
  • Save yowasou/8c60e65a45bbaff6900c08172f0d4711 to your computer and use it in GitHub Desktop.
Save yowasou/8c60e65a45bbaff6900c08172f0d4711 to your computer and use it in GitHub Desktop.
Ruby 3.0.0のCSVクラスがRFC 4180を満たしているかの検証コード
require "csv"
# 各レコードは、改行を区切りとする
csv_text = <<~CSV_TEXT
aaa,bbb,ccc
zzz,yyy,xxx
CSV_TEXT
CSV.parse(csv_text) do |row|
p row
end
# => ["aaa", "bbb", "ccc"]
# ["zzz", "yyy", "xxx"]
# ファイル末尾のレコードの終端には、改行はあってもなくてもよい
csv_text = <<~CSV_TEXT
aaa,bbb,ccc
CSV_TEXT
csv_text = csv_text + "zzz,yyy,xxx"
CSV.parse(csv_text) do |row|
p row
end
# => ["aaa", "bbb", "ccc"]
# ["zzz", "yyy", "xxx"]
# ヘッダ行が存在してもいい
csv_text = <<~CSV_TEXT
field_name1,field_name2,field_name3
aaa,bbb,ccc
zzz,yyy,xxx
CSV_TEXT
CSV.parse(csv_text, headers: true) do |row|
p row
end
#<CSV::Row "field_name1":"aaa" "field_name2":"bbb" "field_name3":"ccc">
#<CSV::Row "field_name1":"zzz" "field_name2":"yyy" "field_name3":"xxx">
# 各行の列数統一
csv_text = <<~CSV_TEXT
aaa,bbb,ccc
aaa,bbb,ccc,ddd
CSV_TEXT
CSV.parse(csv_text) do |row|
p row
end
# => ["aaa", "bbb", "ccc"]
# ["aaa", "bbb", "ccc", "ddd"]
#最後はコンマにしない
csv_text = <<~CSV_TEXT
aaa,bbb,ccc
aaa,bbb,ccc,
CSV_TEXT
CSV.parse(csv_text) do |row|
p row
end
# => ["aaa", "bbb", "ccc"]
# ["aaa", "bbb", "ccc", nil]
# ""で囲んでも囲わなくてもよい
csv_text = <<~CSV_TEXT
"aaa","bbb","ccc"
aaa,bbb,ccc
CSV_TEXT
CSV.parse(csv_text) do |row|
p row
end
# => ["aaa", "bbb", "ccc"]
# ["aaa", "bbb", "ccc"]
# 改行、”、,を含むフィールドは””で囲むべき
csv_text = <<~CSV_TEXT
"aaa","b
bb","ccc"
zzz,yyy,xxx
CSV_TEXT
CSV.parse(csv_text) do |row|
p row
end
# => ["aaa", "b\nbb", "ccc"]
# ["zzz", "yyy", "xxx"]
# ””で囲まれている場合はエスケープする
csv_text = <<~CSV_TEXT
"aaa","b""bb","ccc"
CSV_TEXT
CSV.parse(csv_text) do |row|
p row
end
# => ["aaa", "b\"bb", "ccc"]
# RFC 4180を満たしているといえる
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment