システム開発をしている永松です。
キーボードは英字が好きです。
前回はファイル圧縮について書かせていただきました。
この3回でほぼファイルというものを書ききった感があったのでそろそろ別のやつをやるか。
むしろシリーズを終わらせるか、とも思いましたが、そんなときふとこんな話を聞きました。
CSVってExcelのやつ?
さて、CSVの時間です。
言われてみれば確かにCSVって聞いたことあるし使ったことあるけど具体的に何?と思われてる方が多いと思います。
そもそもテキストファイルなの?バイナリファイルなの?そのレベルだと思います。
え、そこでは迷わない? まさか!
CSVは正式にはComma Separated Valueの頭文字を取ったものです。
つまり、値をカンマで区切ったやつって意味です。
また、ファイル形式としてはテキストファイルとなります。
例を出すと「名前,職業,所属」って書いとけばCSVを名乗れます。
大げさではなく、CSVってこれだけのファイルです。
前回、前々回の圧縮ファイルだ画像ファイルだに比べればまーーーーーーー簡単なやつです。
こんな単純なのになかなか理解してもらえないCSV。
フレンドリーなのに仲良くしてもらえないCSV。
そんなCSVをどういうときに使うのか、なぜCSVが必要なのか、が分かってもらえるよう、簡単なアプリの設計と合わせて書かせていただき、ふんわりと分かってもらおう。
今回はそんなお話です。
※実際にプログラムは書きません。
序章 入力されたデータの保存
お客さんから以下のようなアプリを作って欲しいとの依頼がありました。
・顧客情報を登録したい。
・項目は「名前」「職業」の2つだけである。
こんな話を聞いた私はデータをどうやって登録するかを考え、テキストファイルを使って保存することにしました。
しかし単純に保存してしまうとアプリが認識できなくなってしまいます。
例えば以下のような状態です。
田中太社長
山田清超デザイナー
山田花子営業
こんな保存の仕方をしてしまうとどこまでが名前でどこからが役職なのかがわからなくなってしまいます。
人が見れば見分けはつくんですがパソコンは矛盾がないルールがないと動けないのです。
そこで以下のルールを作ります。
名前は8文字、職業は15文字
このルールに乗っ取ると先ほどのファイルは以下となります。
田中太 社長
山田清 超デザイナー
山田花子 営業
それぞれのデータに空白が入って8文字、15文字で保存されるようになりました。
※「田中太」で3文字、空白で5文字入っています。
これでアプリから名前、職業を見分けて読み込めるようになりました。
この仕様でアプリを作り、お客さんに納品することにしました。
※このデータの保存方法を固定長方式と呼びます。
第一章 超えてきたアイツ
納品してから特に問題なく使ってもらっていたアプリですが、ある日電話がかかってきます。
ある人だけ名前が変な表示になるんです。
なんだろうと思いデータをもらって確認してみました。
田中太 社長
山田清 超デザイナー
山田花子 営業
ジョン・健・ヌッツォ歌手
ぴえん
名前超えてきたよ。
え、そうなると名前も15文字にする?いや、でももっと長い人が来たらどうするの?じゃあもっと長くする?そうするとデータが無駄に重くなる。。
色々悩みました。2,3日悩んだと思います。いや、そんなにかも。
とにかく悩んだ結果、固定長方式をやめることにし、区切りにカンマ(,)を使うことにしました。
結果、以下のような形式で保存することとなりました。
田中太,社長
山田清,超デザイナー
山田花子,営業
ジョン・健・ヌッツォ,歌手
データを読み込むときにカンマで分けてあげれば名前と職業を見分けることが出来ます。
これで大丈夫だ、ということで修正完了の連絡をし、お客さんにも問題なく動くことを確認してもらうことが出来ました。
ちなみに今のデータ仕様はこんな状態です。
・名前と職業はカンマで区切られている。
・1行に一人保存し、改行でそれぞれを分ける。
めでたくCSVの誕生です。
※CSV形式は先ほどの固定長方式に対し、可変長方式と呼びます。
第二章 気づかずに生まれた制約
ある人だけ職業が出てこないんです。
数日後、そんな連絡が届きました。
急ぎデータを送ってもらったところ、以下のようなデータになってました。
田中太,社長
山田清,超デザイナー
山田花子,営業
ジョン・健・ヌッツォ,歌手
藤岡弘,,タレント
パオン
正式名称で登録されてる。
名前にカンマが入ってるから職業が空になってるのか。
これは困った。
カンマで区切った影響でカンマが登録できなくなっていました。
さてどうしたものか。
悩んだ末、それぞれの項目をダブルクォートで括ることとしました。
“田中太”,”社長”
“山田清”,”超デザイナー”
“山田花子”,”営業”
“ジョン・健・ヌッツォ”,”歌手”
“藤岡弘,”,”タレント”
カンマで分けるときに、ダブルクォートの内側にあるカンマは無視するようにします。
これで無事最後の人も職業が出るようになったので、修正完了としお客さんにアプリを送りました。
データ仕様はこうなりました。
・項目はダブルクォートで括る。
・名前と職業はカンマで区切られている。
・ただし、ダブルクォート内のカンマでは区切らない。
・1行に一人保存し、改行でそれぞれを分ける。
※この辺りからプログラムの処理はややこしくなってきます。
第三章 感のいい人は分かるが僕はわからなかった
エラーで動かなくなりました!
そんな連絡が届くまでにそんなに時間はかかりませんでした。
謝罪の意を伝えつつデータを送ってもらったところ、以下のようなデータになっていました。
“田中太”,”社長”
“山田清”,”超デザイナー”
“山田花子”,”営業”
“ジョン・健・ヌッツォ”,”歌手”
“藤岡弘,”,”タレント”
“野中”まさ”雄一”,”ミュージシャン”
パオよりのパオ
カンマで区切ったらカンマが入力できなくなったんだから、ダブルクォートで括ったらダブルクォートが使えなくなる。
当たり前なのに完全に見落としていました。
そりゃそうだ。
そりゃそうなんだけど、じゃあどうしよう。
悩んだ結果、ダブルクォートが含まれている場合は、その前にもう1つダブルクォートをつけることで回避することにしました。
ややこしいので実際のデータを見てみましょう。
“田中太”,”社長”
“山田清”,”超デザイナー”
“山田花子”,”営業”
“ジョン・健・ヌッツォ”,”歌手”
“藤岡弘,”,”タレント”
“野中“”まさ“”雄一”,”ミュージシャン”
データ仕様はこうなります。
・項目はダブルクォートで括る。
・名前と職業はカンマで区切られている。
・ただし、ダブルクォート内のカンマでは区切らない。
・1行に一人保存し、改行でそれぞれを分ける。
・データにダブルクォートが含まれる場合は、さらにダブルクォートを追加する。
読み込むときは、ダブルクォートの判断をするときはダブルクォートが2つ続いた場合は無視する。
という動きに変更しました。
この変更により、データに何が入っていても正常に保存、読み込みが出来るようになりました。
なお、今回のようにプログラムの動きに影響がある記号を動きに影響を及ぼさない文字にするための文字をエスケープ文字といいます。
また、動きに影響を及ぼさなくすることを無害化する、という言い方もします。
さらに、この無害化とエスケープ文字を使うことをまとめてエスケープ処理をするって言います。
幕章 制約から産まれたもの
こんなやり取りは多分なかったと思いますが、第3章で書いているデータ仕様がCSVの仕様です。
単純とはいえ、ちゃんとしたらそこそこ面倒なのは否めませんが世の中そんなもんだと思いませんか?
私はそう思います。
CSVはデータを区切って保存するもの、つまり表形式で保存出来る形式であるため、表計算ソフトのExcelでも開くことが出来るのです。
そのため、CSVはExcelのアイコンになります。が、CSVはExcelでしか開けないわけではなく、すごく汎用的なファイル形式なのです。
今回のブログで、皆さんのCSVに対する恐怖が少しでも和らげば幸いです。
合わせて、システムを作るときはルールが必要であること、ルールを作ると制約が出来ること、もふんわり伝われば、今回の記事は意味があったと思います。
いや、余計わからんわ、となった方は、CSVはメモ帳などのテキストエディタで開き、編集したりすることも出来る。
CSVはExcelがなくても編集が出来る、ということを覚えておいてもらえれば大丈夫です。
CSV、怖くない。
おまけ1:CSVのダブルクォートのルール
説明を簡素化するために全部の列をダブルクォートで囲みましたが、正確にはダブルクォートで囲ってもいいし囲まなくてもいいという仕様です。
データに「カンマ」「ダブルクォート」が含まれる場合にのみダブルクォートで囲めばいいのです。
つまり、以下のデータも正しいCSVです。
田中太,社長
山田清,超デザイナー
山田花子,営業
ジョン・健・ヌッツォ,歌手
“藤岡弘,”,タレント
“野中””まさ””雄一”,ミュージシャン
このように、ダブルクォートで囲まれているもの、囲まれていないものが入り混じっても大丈夫です。
ただし、ソフトによっては読み込めなかったりすることもあるため、囲むなら囲む、囲まないのなら囲まない、としたほうが安全です。
おまけ2:カンマ以外で区切ったら?
さらっとデータの区切りにカンマを利用しましたが、他の記号でも代用可能です。
カンマの次によく使われるのは「TAB」です。
TABで区切ると、そのファイルはTSV(Tab Separated Value)と呼ばれるようになります。
その他にも、「セミコロン(;)」「コロン(:)」などなど、ルールさえ統一されていれば好きな記号で区切っても大丈夫です。
命名規則になぞれば、セミコロンで囲めばSSV(Semicolon Separated Value)となるのですが、CSV、TSV以外はあまりこういう言い方はしません。
理由は単純で、カンマ、TAB以外はあまり使われないからです。
じゃあ何を使うのか言うとカンマ区切りじゃないのに「CSV」となります。
ややこしいのですが、ここでの「CSV」はCharacter Separated Valueの略です。
これだから3文字略は。
永松
この記事を書いた人黙々とパソコンに向き合い、少々の無理難題にも粛々と応える、お悟りお開き系エンジニア。AND SPACEの様々なシステム案件を任されているだけでなく、会社全体の運営にも的を射た意見で常々存在感を発揮する。顧客や同僚にいくら駄々をこねられても、淡々と正論を繰り出す姿は、「ナガえもん」と呼ばれて然り。いかなるシステム案件も、最初は粗々で構わないと言い切れるのは、ユーザー目線の「実際の使用感」が大切なことを重々承知しているから。そこからの喧々諤々こそ真骨頂。皆々、度々、多々、救われる。