質問: ### 前提・実現したいこと 機械学習に興味があり,学びはじめたのですが,よくCSV形式?ファイル?というものを目にします. CSVファイルとは何のためのものですか? どういうところに使うもので,メリットやデメリットはあるのでしょうか?? どうかよろしくお願い致します.
回答: Excelのように複数の行と列になった二次元のデータ、つまり表になるデータを扱いたいときに最も単純な形式がCSVファイルです。 表になっているデータを扱いたいとき、どのようなフォーマットで作れば良いでしょうか?単にデータを並べただけではどこが行でどこが列なのかはわかりません。そこで * 行の中の値の区切りに`,`(カンマcomma)を用いる。 * 行と行の区切りに改行を用いる。 という極めて単純な規則で構成するのがCSVです。CSVはComma-Separated Valuesの略とされ、文字通り、値(valuse)をカンマ(comma)で分離(separated)したものとなります。実際の例を見てみましょう。 ``` 1st,綾波レイ,女,14,零号機 2nd,惣流・アスカ・ラングレー,女,14,弐号機 3rd,碇シンジ,男,14,初号機 4th,鈴原トウジ,男,14,参号機 5th,渚カヲル,男,15,第17使徒 ``` なお、某所によるとこういうデータを**痛コードパターン**といいます。ついでに、私は全話見ていませんし、映画も見ていません。 データ構造が極めて単純であり、またわかりやすい作りになっています。ただのテキストデータですので、メモ帳で作成して編集することもできます。しかし、考えてみてください。もし、データにカンマや改行を含めたいときはどうするのでしょうか?実はそこに大きな問題があります。 CSVファイルはもともと何かしら規格があったわけではありません。そのため、CSVファイルの扱い方は実装によって異なるという状況でした。ほとんど実装において、 * カンマや改行を含めたい場合は`"`で囲む。また、`"`自体を含めたい場合は、`"`で囲った上で`""`と二重化したものを`"`と見なす。 * 改行にはCR(U+000D)LF(U+000A)を使用する。 となっていましたが、これは絶対的な物ではありません。後付けでRFC 4180という規格が作られましたが、多くの実装で採用している方法を取っているだけであり、全てがそうであるとは限らないのです。そして、最も大きな問題として、文字コードを指定する方法がないという問題があります。とくにWindowsのExcelでは、文字コードはロケール依存であり、BOM付きUTF-8で無い限り、日本語環境と英語環境では解釈され方が異なります。 他にもデータは単純な文字列としてしか意味がありません。しかし、これまたExcelは数値や日付だと勝手に見なしてしまう場合があるのです。また、1行目をデータのためのヘッダとして扱う場合もあり、混乱に拍車を掛けます。 ということでまとめたいと思います。 何のために、どういうときに使うというと、表のデータを最も単純にテキストとして表現したいときに使います。メモ帳でも表示・作成・編集できるためExcelのようなソフトを別途用意する必要がありません。 つまり、メリットについては、 * テキストエディタで表示・作成・編集が可能 ということです。そして、私にはこれ以外のメリットは**思い当たりません**。 デメリットは多数あります。 * カンマや改行を含めたいときに表現する方法がソフトによって異なる。(`"`囲むが全てのソフトで有効とは限らない。) * 改行がCRLFとは限らず、LFのみの実装もある。それを読み取れるかもソフトによって異なる。 * 文字コードが規定されていないため、読み込み時に明示的に指定しないと文字化けを起こす可能性がある。 * 文字列としてしか扱えない。`0`という数値と`"0"`という文字列の区別ができない。そのため、ソフトによっては勝手に数値や日付として扱ってしまう場合がある。 * 1行あたりの列がバラバラの場合は、余計な列の分についての解釈がソフトによって異なる。 * データ無しと空文字列の区別ができない。 * 数値のみを扱いたい場合でも文字列となるため、データサイズが大きくなる。 * 1行目がヘッダであったとしても、それがヘッダであると言うことを示すことができない。 Excelファイルで適当な日本語があるデータを作り、CSVファイルとして保存して、LibreOfficeのCalcで開いてみてください。単純にそのまま開くと文字化けして使い物になら無いと思います。それぐらいCSVファイルは扱いに注意が必要であり、データとして扱うのに良い形式とは言えません。 なお、CSVの親戚で区切りにタブを用いたTSVというのもあります。