[12] CSV は、行の区切りに改行、
行内の列の区切りに ,
を使ったテキストファイルで表を表すデータ形式です。
[17] 単純で古くから広く使われていた形式なので、実装ごとに様々なバリエーションがあります。 現在に至るまで広く共通して採用されている仕様は存在していません。
[54] 世の中一般にいう 「CSV」 を完全に規定する仕様書は存在しません。
[1] IETF における CSV の書式が RFC 4180 >>24 になりました。
[22] しかし世間に無数に溢れる CSV のバリエーションの一つでしかなく、 世の中の CSV のすべてをカバーすることを目的にしたものでは無さそうで、 実際カバーできていません。
[68]
「RFC 4180 に従う」
と定められている時 RFC 4180 を根拠に正しい、誤りを判定できますが、
そうでない「CSV ファイル」が正しいか否かを RFC 4180
を根拠に断言するのは誤りです。
[64] 「Common usage of CSV is US-ASCII」 >>24 という出版の RFC とはおおよそ考え得ないようなことが書かれています。 IETF ご自慢の国際化の専門家様方は誰もレビューしなかったのでしょうか? どうやらこの RFC は米国以外は視野に入っていないみたいです。
[75] >>73 「本物のCSV」がどこの誰が決めた何なのか教えてほしい...
[76] >>74 最大手の実装と互換性のない (ことを自覚する) 「標準」仕様に何の意味があるのかも教えてほしい...
[18] ,
のかわりに TAB を使った TSV もよく使われています。
それ以外の記号が使われることもあります。これらも広義の CSV
として扱われることもしばしばあります。
[55] TSV は CSV の一種だという人がいます。 CSV は TSV の一種だという人がいます。 一方に対応した実装が、他方にも対応していることがあります。 両方に対応した中立的な立場を取る実装もあります。
[56] CSV も TSV もそれぞれバリエーションが多いので、 互いがどういう関係にあるかを一概に言うことはできません。 「同じような、違うような、よく似たようなもの」です。
[59] CSV は歴史が長く、テキストファイルで使われるあらゆる文字コードが使われてきたといっても過言ではありません。
[60] 日本では令和時代になっても未だシフトJISのCSVファイルが流通しているようです。
[63]
現代では CRLF
と LF
がほとんどで、
CR
やその他はほぼ使われないと思わます。
[77]
Microsoft Excel に文字コードを正しく認識させる目的で
BOM
を使うことがよくあります (>>7)。
近年 CSV 以外のテキストファイルでは BOM
を使わないことが多いのとは対照的です。
[7] Excel は UTF-8 CSV 読めない。 UTF-16LE BOM つきなら読める。ただし明示的に , 区切りと指定しないと認識しない。
[78] >>7 いまの Microsoft Excel は UTF-8 + BOM
を読めます。
>>79
[27] RFC 4180 は ABNF 構文で ASCII文字しか認めていません。
charset
引数は規定していますが、特別な解釈は何も定義されていませんから、
charset
引数に関わらず、結局使えるのは
ASCII文字だけです。
[31] \
(U+005C
) をエスケープに用いるバリエーションもありますが、
あまり普及していません >>30。一方で、 \
が円記号として使われることもあります。
CSV は価格を扱うことが、他のデータ形式よりは多そうです。
エスケープとみなすかどうかで、実装によって解釈がかなり変わってくることになります。
[32] 最後に END
だけの行を置いて、データの末尾を示すことがあります。
列数に関わらず、 ,
は使いません。
あまり一般的ではなく、対応していない実装ではデータの一部と解釈されることでしょう。
[81]
すべての行の列数が等しくなるように生成される/そうでなければ読み込みエラーとすることもあれば、
行の末尾が空欄なら ,
を付けない場合もあります。
[82]
すべてのこまを "
で括る実装もあれば、必要最低限だけ "
で括ることもあります。 "
を括る、括らないの判断基準が外部からの観察ではわからないこともあります。
[83]
"
で括ることでこま内に改行を含められることもあれば、
そのようなデータを認めない (改行を CSV 行の区切りとみなす)
こともあります。
[69] CSV Dialect はバリエーションを記述するための仕様です。
[80] が、あまり普及していませんし、世間のすべてのバリエーションを記述できるわけでもありません。
[33] CSV から行と列のデータを取り出したとしても、 その解釈はまちまちです。
[34] 先頭行が見出しと解釈されるべきもののこともあれば、 そうでないこともあります。 見出しや、その他補足情報などで数行使うこともあります。
[84] 大分類、中分類、小分類のように見出しの階層があって数行使うことがあります。
[35] 合計額等のまとめの行や注記事項などで終わりの数行を使うこともあります。
[36] 複数の行のまとまりが1つの CSV に含まれる場合、 まとまりの間に空行を置いたり、見出しや説明などをその間に挟んだりします。
[47] CSV それ自体にデータ型の仕組みはありません。 CSV の表形式データのこまとして記述された文字列が、 いかに解釈されるかは応用依存です。
[48] 実装によっては、 整数のように見えるものを整数型に、 小数のように見えるものを実数型に、 日時のように見えるものを日付型になどと自動的に解釈するものもあります。 特定アプリケーションの仕様としてならともかく、 汎用のライブラリーなのにそのように決め打ちにしているものもあります。
[49] どのようなパターンなら各データ型とし、 どうなら文字列とみなすのかも、 実装によって様々です。
[50]
CSV ファイルにそのまま書かれているか、 "
で括って書かれているかによって挙動が変わる実装もあります。
[57] CSVW は CSV を Semantic Web で使うもので、引いては RDF のデータ型である XML Schemaデータ型が使えることになります。 しかし CSVW は使っている人がいるのかも怪しい、知る人ぞ知るレベルの代物です。
charset | IETF charset | US-ASCII | charset | IETF 情報提供 | RFC 4180 |
header | present / absent | (自動) | 見出し行の有無 | IETF 情報提供 | RFC 4180 |
[25] 素片識別子は RFC 7111 >>16 で規定されています。
[26] ほとんど使われておらず、実装もあまりありません。
[52] 別の提案
[3] Comma-Separated Values - Wikipedia ( ( 版)) http://ja.wikipedia.org/wiki/Comma-Separated_Values
[6] XForms 2.0 - W3C XForms Group Wiki (Public) ( ( 版)) http://www.w3.org/MarkUp/Forms/wiki/XForms_2.0#External_CSV_values
[8] Model for Tabular Data and Metadata on the Web ( ( 版)) http://www.w3.org/TR/2014/WD-tabular-data-model-20140327/
[10] SPARQL 1.1 Query Results CSV and TSV Formats ( ( 版)) http://www.w3.org/TR/2013/REC-sparql11-results-csv-tsv-20130321/#general-comments
[30] CSVファイルフォーマットの解説:CodeZine(コードジン) ( 版) https://codezine.jp/article/detail/2364
[37] 1048535 – Cross-origin info leak: [[get]] calls on global expose text (or CSV) sniffed as JS () https://bugzilla.mozilla.org/show_bug.cgi?id=1048535
[39] Block additional "script" MIME types (evilpie著, ) https://github.com/whatwg/fetch/commit/2e85ceffe027fe97d56184c8a4fe6f11b5780193
[67] 元号年が入っていてほしいのに西暦年しか入っていないことが多くて困る>_<
[4] 公共料金その他で CSV をダウンロードできるところは HTML が UTF-8 でも CSV だけシフトJISのところが未だに多いようですね。
[5] Papa Parse - Powerful CSV Parser for JavaScript () https://www.papaparse.com/
[11] adaltas/node-csv: Full featured CSV parser with simple api and tested against large datasets. () https://github.com/adaltas/node-csv
[43] adaltas/node-csv-parse: CSV parsing implementing the Node.js `stream.Transform` API () https://github.com/adaltas/node-csv-parse
[44] okfn/csv.js: Simple, ultra-light (10kb) JS library for CSV parsing. Works in browser and node with zero dependencies. () https://github.com/okfn/csv.js/
[45] CSV Dialect () https://frictionlessdata.io/specs/csv-dialect/
[53] mholt/PapaParse: Fast and powerful CSV (delimited text) parser that gracefully handles large files and malformed input () https://github.com/mholt/PapaParse
[65] yoh2さんはTwitterを使っています 「CSV …,"aaa"bbb"ccc",… 1. エラー (これで済むならこれにしたい) 2. aaa"bbb"ccc (単純に "" で囲っただけと思って扱う; LibreOffice Calc がこれ) 3. aaabbb"ccc" (2番目の " 以降はフィールド区切りまでそのままの内容; Excel がこれ) 4. aaabbbccc (" が表れるたびに囲み開始・終了)」 / Twitter (午後7:04 · 2021年6月30日 , ) https://twitter.com/yoh2_sdj/status/1410177450659639297
[66] にゃいすねいにゃん🐈さんはTwitterを使っています 「みずほ銀行のシステムを触りたい言ってるエンジニア兄貴、CSVファイルに,区切りの数値がダブルクォーテーションで囲われないまま対向システムが送ってくるけれどIF定義書に書いてないとかいう恐怖味わったこと無いから言えるんダ」 / Twitter (午後9:32 · 2021年8月23日 , ) https://twitter.com/a83ip/status/1429783528762314766
[71] CSVファイル経由で感染するウイルス(ただしExcel限定)が話題に | スラド セキュリティ, https://security.srad.jp/story/18/06/01/0532257/
,
(0x2C
) はシフトJISの第2バイトに使われることはありませんから、 面倒はおきません。"
(0x22
) も問題ありません。 (でも\
(0x5C
) は思いっきり使われます...)