[12] [DFN[[[CSV]]]] は、[[行]]の区切りに[[改行]]、
[[行]]内の[[列]]の区切りに [CODE[[[,]]]] を使った[[テキストファイル]]で[[表]]を表す[[データ形式]]です。

[17] 単純で古くから広く使われていた形式なので、実装ごとに様々なバリエーションがあります。
現在に至るまで広く共通して採用されている[[仕様]]は存在していません。

* 仕様書

[54] 
世の中一般にいう 「CSV」 を完全に[[規定]]する[[仕様書]]は存在しません。

-*-*-

[1] [[IETF]] における [[CSV]] の書式が [DFN[[[RFC 4180]]]] [SRC[>>24]] になりました。

[REFS[
- [24] [CITE@en[[[RFC 4180]] - Common Format and MIME Type for Comma-Separated Values (CSV) Files]] ([TIME[2016-01-08 20:01:55 +09:00]] 版) <http://tools.ietf.org/html/rfc4180>
- [46] [CITE[[[RFC Errata Report]] » [[RFC Editor]]]], [TIME[2020-12-21T04:07:52.000Z]] <https://www.rfc-editor.org/errata_search.php?rfc=4180>
- [16] [CITE@en[[[RFC 7111]] - URI Fragment Identifiers for the text/csv Media Type]]
([TIME[2014-01-27 23:43:58 +09:00]] 版)
<http://tools.ietf.org/html/rfc7111>
]REFS]

[22] しかし世間に無数に溢れる [[CSV]] のバリエーションの一つでしかなく、
世の中の [[CSV]] のすべてをカバーすることを目的にしたものでは無さそうで、
実際カバーできていません。

[68] 
「[[RFC 4180]] に従う」
と定められている時 [[RFC 4180]] を根拠に正しい、誤りを判定できますが、
そうでない「CSV ファイル」が正しいか否かを [[RFC 4180]]
を根拠に断言するのは誤りです。
[SEE[ [[誤用]] ]]

[64] 
「Common usage of CSV is US-ASCII」 [SRC[>>24]]
という[TIME[西暦2005年][2005]]出版の [[RFC]]
とはおおよそ考え得ないようなことが書かれています。
[[IETF]] ご自慢の[[国際化]]の専門家様方は誰もレビューしなかったのでしょうか?
どうやらこの [[RFC]] は[[米国]]以外は[[視野に入っていない][欧米中心主義]]みたいです。



* TSV との関係

[18] [CODE[[[,]]]] のかわりに [[TAB]] を使った [[TSV]] もよく使われています。
それ以外の記号が使われることもあります。これらも広義の [[CSV]]
として扱われることもしばしばあります。

[55] [[TSV]] は [[CSV]] の一種だという人がいます。
[[CSV]] は [[TSV]] の一種だという人がいます。
一方に対応した実装が、他方にも対応していることがあります。
両方に対応した中立的な立場を取る実装もあります。

[56] 
[[CSV]] も [[TSV]] もそれぞれバリエーションが多いので、
互いがどういう関係にあるかを一概に言うことはできません。
「同じような、違うような、よく似たようなもの」です。

* 文字コード

[58] 
[[UTF-8]] を使う[SHOULD[べきです]]。

-*-*-

[59] 
[[CSV]] は歴史が長く、[[テキストファイル]]で使われるあらゆる[[文字コード]]が使われてきたといっても過言ではありません。

[60] 
[[日本]]では[[令和時代]]になっても未だ[[シフトJIS]]の[[CSV]]ファイルが流通しているようです。
;; [61] 
幸い [CODE[,]] ([CODE[0x2C]]) は[[シフトJIS]]の[[第2バイト]]に使われることはありませんから、
面倒はおきません。
[CODE["]] ([CODE[0x22]]) も問題ありません。
(でも [CODE[\]] ([CODE[0x5C]]) は思いっきり使われます...)

[62] 
[[改行コード]]もあらゆるものが使われます。

[63] 
現代では [CODE(charname)@en[CRLF]] と [CODE(charname)@en[LF]] がほとんどで、
[CODE(charname)@en[CR]] やその他はほぼ使われないと思わます。

[77] 
[[Microsoft Excel]] に[[文字コード]]を正しく認識させる目的で
[CN[BOM]]
を使うことがよくあります (>>7)。
近年 [[CSV]] 以外の[[テキストファイル]]では [CN[BOM]] を使わないことが多いのとは対照的です。

* バリエーション

[7] [[Excel]] は UTF-8 CSV 読めない。 UTF-16LE BOM つきなら読める。ただし明示的に , 区切りと指定しないと認識しない。

[78] >>7 いまの [[Microsoft Excel]] は [[UTF-8]] + [CN[BOM]] を読めます。
[SRC[>>79]]

[REFS[

- [79] [CITE@ja-JP[Excel で CSV UTF-8 ファイルを正しく開く - Microsoft サポート]], [TIME[2024-08-29T02:47:24.000Z]] <https://support.microsoft.com/ja-jp/office/excel-%E3%81%A7-csv-utf-8-%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E6%AD%A3%E3%81%97%E3%81%8F%E9%96%8B%E3%81%8F-8a935af5-3416-4edd-ba7e-3dfd2bc4a032>

]REFS]

[27] [[RFC 4180]] は [[ABNF]] 構文で [[ASCII文字]]しか認めていません。
[CODE(MIME)@en[charset]] [[引数]]は規定していますが、特別な解釈は何も定義されていませんから、
[CODE(MIME)@en[charset]] [[引数]]に関わらず、結局使えるのは
[[ASCII文字]]だけです。

;; [28] [[RFC 4180]] は2005年出版で、どう考えても現実とは程遠い規定です。
[[IETF]] は[[ファンタジー]]世界か何かの[[標準化団体]]なのでしょうか。

[31] [CODE[\]] ([CODE[U+005C]]) を[[エスケープ]]に用いるバリエーションもありますが、
あまり普及していません [SRC[>>30]]。一方で、 [CODE[\]]
が[[円記号]]として使われることもあります。
[[CSV]] は[[価格]]を扱うことが、他のデータ形式よりは多そうです。
[[エスケープ]]とみなすかどうかで、実装によって解釈がかなり変わってくることになります。

[32] 最後に [CODE[END]] だけの[[行]]を置いて、データの末尾を示すことがあります。
[[列]]数に関わらず、 [CODE[,]] は使いません。
あまり一般的ではなく、対応していない実装ではデータの一部と解釈されることでしょう。

[81] 
すべての[[行]]の[[列]]数が等しくなるように生成される/そうでなければ読み込みエラーとすることもあれば、
[[行]]の末尾が空欄なら [CH[,]] を付けない場合もあります。

[82] 
すべての[[こま]]を [CH["]] で括る実装もあれば、必要最低限だけ [CH["]]
で括ることもあります。 [CH["]] を括る、括らないの判断基準が外部からの観察ではわからないこともあります。

[83] 
[CH["]] で括ることで[[こま]]内に[[改行]]を含められることもあれば、
そのようなデータを認めない ([[改行]]を [[CSV]] [[行]]の区切りとみなす)
こともあります。

-*-*-

[69] 
[[CSV Dialect]] はバリエーションを記述するための仕様です。

[80] 
が、あまり普及していませんし、世間のすべてのバリエーションを記述できるわけでもありません。

* オレオレCSV定義

[89] 
世に溢れる「CSV」が千差万別であるだけでなく、
「ぼくのかんがえた正しいCSV」
も山程あります。


- [73] [CITE@ja[Xユーザーのartonさん: 「そう言えば、"'括りの内部に改行ありのCSVをExcelがどうやっても(おれの知識では)正しくインポートできずに困ったことがあった(Excelですら本物のCSVを処理できない)」 / X]], [TIME[午前9:51 · 2024年8月28日][2024-08-28T00:51:03.000Z]], [TIME[2024-08-28T05:20:58.000Z]] <https://x.com/arton/status/1828596121708691756>
-- [74] [CITE@ja[Xユーザーの江添亮さん: 「RFC 4180にも名指しで、「一部の実装、特にMicrosoft Excelはサポートしていない」と書かれているからなぁ。」 / X]], [TIME[午後0:02 · 2024年8月28日][2024-08-28T03:02:32.000Z]], [TIME[2024-08-28T05:20:58.000Z]] <https://x.com/EzoeRyou/status/1828629207653679593>



[75] 
>>73 「本物のCSV」がどこの誰が決めた何なのか教えてほしい...


[76] >>74
最大手の実装と互換性のない (ことを自覚する) 「標準」仕様に何の意味があるのかも教えてほしい...




-[85] [CITE@ja[Xユーザーの後藤 浩昭 / GORRYさん: 「マイナポータルで医療費情報のCSVデータをダウンロードしたんだけどさ…これはCSVって言いませんよ…? てか、こういう形式ならむしろJSONで出してくれ…w https://t.co/fdCPZu63Rl」 / X]], [TIME[午前4:07 · 2025年3月3日][2025-03-02T19:07:35.000Z]], [TIME[2025-03-03T01:34:39.000Z]] <https://x.com/gorry5/status/1896276217218924753>
--[87] [CITE@ja[Xユーザーの後藤 浩昭 / GORRYさん: 「「カンマで区切られたデータだからCSV」という返信がかなりあって驚く…。 CSVというのは、細かい書式以前に「2次元のデータを、横軸をカンマ、縦軸を改行で区切ったデータ構造」という大前提があります。」 / X]], [TIME[午後0:54 · 2025年3月3日][2025-03-03T03:54:05.000Z]], [TIME[2025-03-03T07:06:34.000Z]] <https://x.com/gorry5/status/1896408712124014953>


[86] >>85 このように「自分の使いやすい形式のCSV」以外を CSV と認めない人もいる


[88] オレオレ基準で政府批判、さぞ気持ちいいだろうね。政府は殴り返してこないから。



* データの解釈

[33] [[CSV]] から[[行]]と[[列]]のデータを取り出したとしても、
その解釈はまちまちです。

[34] 先頭行が[[見出し]]と解釈されるべきもののこともあれば、
そうでないこともあります。
[[見出し]]や、その他補足情報などで数行使うこともあります。

[84] 
大分類、中分類、小分類のように[[見出し]]の階層があって数行使うことがあります。

[35] 合計額等のまとめの行や注記事項などで終わりの数行を使うこともあります。

[36] 複数の行のまとまりが1つの [[CSV]] に含まれる場合、
まとまりの間に空行を置いたり、[[見出し]]や説明などをその間に挟んだりします。

** データ型

[47] 
[[CSV]] それ自体に[[データ型]]の仕組みはありません。
[[CSV]] の[[表]]形式データの[[こま]]として記述された[[文字列]]が、
いかに解釈されるかは[[応用]]依存です。

[48] 
実装によっては、
[[整数]]のように見えるものを[[整数型]]に、
[[小数]]のように見えるものを[[実数型]]に、
[[日時]]のように見えるものを[[日付型]]になどと自動的に解釈するものもあります。
特定[[アプリケーション]]の仕様としてならともかく、
汎用の[[ライブラリー]]なのにそのように決め打ちにしているものもあります。

[49] 
どのようなパターンなら各[[データ型]]とし、
どうなら[[文字列]]とみなすのかも、
実装によって様々です。

[50] 
[[CSV]] ファイルにそのまま書かれているか、 [CODE["]] 
で括って書かれているかによって挙動が変わる実装もあります。


[57] 
[[CSVW]] は [[CSV]] を [[Semantic Web]] で使うもので、引いては
[[RDF]] の[[データ型]]である [[XML Schemaデータ型]]が使えることになります。
しかし [[CSVW]] は使っている人がいるのかも怪しい、知る人ぞ知るレベルの代物です。


** アプリケーション依存の解釈

[70] [[Googleスプレッドシート]]

* MIME型

[21] [[媒体型]]名は [CODE(MIME)@en[[[text/csv]]]] です。

** 引数

[2]

,[CODE(MIME)@en[[[charset]]]]	,[[IETF]] [[charset]]	,[CODE(charset)@en[[[US-ASCII]]]]	,[[charset]]	,[[IETF]] [[情報提供]]	,[[RFC 4180]]
,[CODE(MIME)@en[[[header]]]]	,[CODE(MIME)@en[[[present]]]] / [CODE(MIME)@en[[[absent]]]]	,(自動)	,[[見出し行]]の有無	,[[IETF]] [[情報提供]]	,[[RFC 4180]]

* 素片識別子

[25] [[素片識別子]]は [DFN[RFC 7111]] [SRC[>>16]] で規定されています。

[26] ほとんど使われておらず、実装もあまりありません。

- [9] [CITE[mhausenblas/addrable]]
( ([TIME[2014-04-24 23:35:59 +09:00]] 版))
<https://github.com/mhausenblas/addrable>
-- [51] [CITE@en[addrable/addrable_syntax.md at master · mhausenblas/addrable · GitHub]], [TIME[2020-12-21T04:16:15.000Z]] <https://github.com/mhausenblas/addrable/blob/master/doc/addrable_syntax.md>

[52] 別の提案

* 応用


** RFC 4180 CSV の応用

[72] [[Simple Data Format]]

* 関連

[23] [[CVS]] と綴りが似ていてたまに混乱します。

* 歴史

** 素片識別子

[REFS[
- [13] [CITE@en[draft-hausenblas-csv-fragment-00 - URI Fragment Identifiers for the text/csv Media Type]]
([TIME[2011-08-08 08:53:47 +09:00]] 版)
<http://tools.ietf.org/html/draft-hausenblas-csv-fragment-00>
- [14] [CITE@en[draft-hausenblas-csv-fragment-03 - URI Fragment Identifiers for the text/csv Media Type]]
( ([TIME[2013-05-05 00:12:07 +09:00]] 版))
<http://tools.ietf.org/html/draft-hausenblas-csv-fragment-03>
- [15] <https://github.com/dret/I-D/tree/master/csv-fragment>
]REFS]

* メモ

[3] [CITE@ja[Comma-Separated Values - Wikipedia]]
( ([TIME[2012-08-06 00:45:41 +09:00]] 版))
<http://ja.wikipedia.org/wiki/Comma-Separated_Values>

[6] [CITE[XForms 2.0 - W3C XForms Group Wiki (Public)]]
( ([TIME[2013-12-13 00:30:35 +09:00]] 版))
<http://www.w3.org/MarkUp/Forms/wiki/XForms_2.0#External_CSV_values>

[8] [CITE@en[Model for Tabular Data and Metadata on the Web]]
( ([TIME[2014-03-22 14:38:26 +09:00]] 版))
<http://www.w3.org/TR/2014/WD-tabular-data-model-20140327/>


[10] [CITE[SPARQL 1.1 Query Results CSV and TSV Formats]]
( ([TIME[2013-03-21 20:27:53 +09:00]] 版))
<http://www.w3.org/TR/2013/REC-sparql11-results-csv-tsv-20130321/#general-comments>

[FIG(quote)[
[FIGCAPTION[
[19] [CITE@en[Model for Tabular Data and Metadata on the Web]]
([TIME[2015-12-03 19:28:42 +09:00]] 版)
<http://www.w3.org/TR/2015/REC-tabular-data-model-20151217/>
]FIGCAPTION]

> This definition of CSV used in this document is based on IETF's '''['''RFC4180''']''' which is an Informational RFC. The working group's expectation is that future suggestions to refine RFC 4180 will be relayed to the IETF (e.g. around encoding and line endings) and contribute to its discussions about moving CSV to the Standards track.

]FIG]


[FIG(quote)[
[FIGCAPTION[
[20] [CITE@en[Model for Tabular Data and Metadata on the Web]]
([TIME[2015-12-03 19:28:42 +09:00]] 版)
<http://www.w3.org/TR/2015/REC-tabular-data-model-20151217/#h-parsing>
]FIGCAPTION]

> This section describes an algorithm for parsing formats that do not adhere to the constraints described in section 7. Best Practice CSV, as well as those that do, and extracting embedded metadata.

]FIG]

[FIG(quote)[
[FIGCAPTION[
[29] [CITE@ja[Comma-Separated Values - Wikipedia]]
([TIME[2016-02-13 04:30:17 +09:00]] 版)
<https://ja.wikipedia.org/wiki/Comma-Separated_Values>
]FIGCAPTION]

> 類似したフォーマットとして、タブ区切りされた tab-separated values (TSV)や、半角スペース区切りされた space-separated values (SSV) などがあり、これらをまとめて character-separated values (CSV)、delimiter-separated values とも呼ばれることも多い。

]FIG]


[30] [CITE@ja[CSVファイルフォーマットの解説:CodeZine(コードジン)]]
([TIME[2016-03-15 17:17:19 +09:00]] 版)
<https://codezine.jp/article/detail/2364>

[37] [CITE@en[1048535 – Cross-origin info leak: '''[''''''['''get''']'''''']''' calls on global expose text (or CSV) sniffed as JS]]
([TIME[2016-07-26 21:12:02 +09:00]])
<https://bugzilla.mozilla.org/show_bug.cgi?id=1048535>

[FIG(quote)[
[FIGCAPTION[
[38] [CITE@en[REST API]]
( ([TIME[2016-02-27 07:16:28 +09:00]]))
<http://quasar-analytics.org/docs/restapi/>
]FIGCAPTION]

> text/csv	Comma-separated results. See Note below.
> Note: The formatting of CSV output can be controlled with an extended media type with parameters for columnDelimeter, quoteChar and escapeChar. For example:
> Accept: text/csv; columnDelimiter="|"&rowDelimiter=";"&quoteChar="'"&escapeChar="\".

]FIG]


[39] [CITE@en[Block additional "script" MIME types]]
([[evilpie]]著, [TIME[2016-08-30 02:51:43 +09:00]])
<https://github.com/whatwg/fetch/commit/2e85ceffe027fe97d56184c8a4fe6f11b5780193>

[FIG(quote)[
[FIGCAPTION[
[40] [CITE@ja[またすこし研究者の皆様へ | 衆議院議員 河野太郎公式サイト]]
([TIME[2016-12-01 16:25:52 +09:00]])
<http://www.taro.org/2016/11/%e3%81%be%e3%81%9f%e3%81%99%e3%81%93%e3%81%97%e7%a0%94%e7%a9%b6%e8%80%85%e3%81%ae%e7%9a%86%e6%a7%98%e3%81%b8.php>
]FIGCAPTION]

> 1. CSVを取得するまでに、いくつもの段階を踏まねばならず、一つのデータをダウンロードするのに大変な労力がかかる
> 2. 拡張子は確かにCSVだが、ファイルの中身はCSV形式ではなく、自動処理に適さない(具体例は3.4.)
> 3. 統計名などの表の値の意味をあらわすカラム名(=ヘッダー)ではない情報が先頭に付与されている
> 4. ヘッダー相当のデータが複数存在する
> 5. ヘッダー相当のデータに抜けが存在する
> 6. 数値が「”119,879.2″」のように、, を打たれたままになっている
> 7. 期の指定が「”1994000103″」のように、意味不明な数値な点、「1994-01-01 00:00:00」以上、「1994-04-01 00:00:00」未満の期間として記述するのが好ましい
> 8. 同じく日本語の期の指定が「”1994年1~3月期”」のように書かれており、7. と重複する情報となっているように思える、
> 9. CSV的に数値を “” で囲む表現は許容されるが、自動処理に当たっては、数値は “” で囲む表現をしない方がより良い
> 10. 全くの空白が続くデータの系列が存在している

]FIG]

[67] 
[[元号年]]が入っていてほしいのに[[西暦年]]しか入っていないことが多くて困る>_<


[FIG(quote)[
[FIGCAPTION[
[41] [CITE@ja-JP[Excel で UTF‐8 の CSV を作成したい - マイクロソフト コミュニティ]]
( ([TIME[2017-01-27 15:25:59 +09:00]]))
<https://answers.microsoft.com/ja-jp/msoffice/forum/msoffice_excel-mso_winother/excel-%E3%81%A7-utf8-%E3%81%AE-csv/25d8bea2-f20c-4feb-9216-e06cb3bf0757>
]FIGCAPTION]

> 手元の PC で確認したところ、Excel 2010、2013 で '''['''名前を付けて保存''']''' > '''['''ファイルの種類 : CSV (カンマ区切り) (*.csv)''']''' で保存する時に、文字コードを選択することは出来ないようです。
> そのため、Excel の通常の操作だけで、文字コードが UTF-8 の CSV ファイルを作成するのは難しいかもしれません。
> 

]FIG]


[FIG(quote)[
[FIGCAPTION[
[42] [CITE@ja-JP[Windows 版 Excel 2016 の新機能 - Excel]]
( ([TIME[2017-01-27 15:28:33 +09:00]]))
<https://support.office.com/ja-jp/article/Windows-%e7%89%88-Excel-2016-%e3%81%ae%e6%96%b0%e6%a9%9f%e8%83%bd-5fdb9208-ff33-45b6-9e08-1f5cdb3a6c73?ui=ja-JP&rs=ja-JP&ad=JP>
]FIGCAPTION]

> 2016 年 10 月の更新プログラム
>  
> これについては、「Excel User Voice forum」 (Excel に関するユーザーの声フォーラム) でご要望がありました。UTF-8 文字エンコードを使用する CSV ファイルを開いて保存することができるようになりました。'''['''ファイル''']'''、'''['''名前を付けて保存''']'''、'''['''参照''']''' の順に進みます。次に、'''['''ファイルの種類''']''' メニューをクリックすると、'''['''CSV UTF-8 (コンマ区切り)''']''' の新しいオプションが表示されます。

]FIG]

[4] 公共料金その他で [[CSV]] を[[ダウンロード]]できるところは [[HTML]]
が [[UTF-8]] でも [[CSV]] だけ[[シフトJIS]]のところが未だに多いようですね。
[TIME[2018-01-03T06:44:11.900Z]]

[5] [CITE[Papa Parse - Powerful CSV Parser for JavaScript]]
([TIME[2019-09-17 21:15:57 +09:00]])
<https://www.papaparse.com/>

[11] [CITE@en[adaltas/node-csv: Full featured CSV parser with simple api and tested against large datasets.]]
([TIME[2019-10-07 09:27:39 +09:00]])
<https://github.com/adaltas/node-csv>

[43] [CITE@en[adaltas/node-csv-parse: CSV parsing implementing the Node.js `stream.Transform` API]]
([TIME[2019-10-07 09:29:05 +09:00]])
<https://github.com/adaltas/node-csv-parse>

[44] [CITE@en[okfn/csv.js: Simple, ultra-light (10kb) JS library for CSV parsing. Works in browser and node with zero dependencies.]]
([TIME[2019-10-07 09:31:15 +09:00]])
<https://github.com/okfn/csv.js/>

[45] [CITE@en[CSV Dialect]]
([TIME[2019-08-23 16:16:21 +09:00]])
<https://frictionlessdata.io/specs/csv-dialect/>

[53] [CITE@en[mholt/PapaParse: Fast and powerful CSV (delimited text) parser that gracefully handles large files and malformed input]]
([TIME[2021-01-12T05:14:34.000Z]])
<https://github.com/mholt/PapaParse>

[65] [CITE@ja[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日 [TZ[+09:00]], [TIME[2021-07-01T07:53:09.000Z]])
<https://twitter.com/yoh2_sdj/status/1410177450659639297>

[66] [CITE@ja[にゃいすねいにゃん🐈さんはTwitterを使っています 「みずほ銀行のシステムを触りたい言ってるエンジニア兄貴、CSVファイルに,区切りの数値がダブルクォーテーションで囲われないまま対向システムが送ってくるけれどIF定義書に書いてないとかいう恐怖味わったこと無いから言えるんダ」 / Twitter]]
(午後9:32 · 2021年8月23日 [TZ[+09:00]], [TIME[2021-08-24T02:08:55.000Z]])
<https://twitter.com/a83ip/status/1429783528762314766>

[71] 
[CITE@ja[CSVファイル経由で感染するウイルス(ただしExcel限定)が話題に | スラド セキュリティ]], [TIME[2024-01-22T13:48:09.000Z]] <https://security.srad.jp/story/18/06/01/0532257/>

