Created
April 7, 2021 13:27
-
-
Save yowasou/8c60e65a45bbaff6900c08172f0d4711 to your computer and use it in GitHub Desktop.
Ruby 3.0.0のCSVクラスがRFC 4180を満たしているかの検証コード
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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