// See https://datatracker.ietf.org/doc/html/rfc4180.html. file = { row ~ (NEWLINE ~ row)* ~ NEWLINE? } row = { item ~ (comma ~ item)* } item = { escaped_item | non_escaped_item } escaped_item_content = { (legal_ascii | comma | NEWLINE | double_quote{2})* } escaped_item = { double_quote ~ escaped_item_content ~ double_quote } non_escaped_item = { legal_ascii+ } legal_ascii = { '\x20'..'\x21' | '\x23'..'\x2B' | '\x2D'..'\x7E' } comma = { "," } double_quote = { "\"" }