見出し画像

CSV形式ファイルでプログラマーが1度は失敗すること

 エクセルなどの表計算ソフトを使ってデータを整理して、CSV形式のファイルとして保存してから、自分で作ったプログラムで読みこむ、といった方法がよくとられます。エクセル形式(.xls, .xlsx)を直接読んでもいいのですが、シートが複数ある場合は、どのシートを読み込むのかを選択しなければいけませんし、少々面倒です。その点、CSVはテキスト形式で、コンマ区切りでデータを抜き出してくれてわかりやすいと思います。CSVファイルを配列に直接読み込んでくれる便利な関数もあります。
 CSVファイルはテキスト形式なんだから簡単に読み込めるだろ?と思っている方も多いと思いますが、そうとも言えません。ちょっと実践的な話になりますが、ここでは、CSV ファイルを自分のプログラムで読み込む際、陥りがちな例を紹介しましょう。次のように、横3列、縦5行の表があったとします。

画像3

左端の列(A列)には果物の名前、先頭の行(1行)には店舗A, Bが記載されていて、その他の2列・4行のセルには各店舗のそれぞれの果物の売り上げが書かれています。エクセルで「コンマ区切りのCSVファイル」として保存して、そのファイルをテキストエディタで開くとこんな感じになります。

Fruits,A,B
Apple,1000,2000
Orange,2000,1000
Grape,1500,500
Banana,3000,4000

たとえば店舗Bのバナナの売り上げは4000です。コンマでデータが仕切られているのでわかりやすいですよね。このような区切りのことをデリミター(delimiter)といいます。


 次に、あたらしい行として、スイカ(Watermelon)を追加してみましょう。ただし、表にすると横に長くなるのでWaterとmelonの間には改行を入れることにします。

画像3

すると、CSVファイルはこのようになります。CSV形式の場合、改行が入るとダブルクォーテーションでその中身を囲むようになります。そのため、一行ごとに1つの果物のデータがある、という前提が崩れてしまいます。

Fruits,A,B
Apple,1000,2000
Orange,2000,1000
Grape,1500,500
Banana,3000,4000
"Water
melon",2000,2000


 さらに、売り上げの1000という数値を1,000というふうに、3桁ごとにコンマを入れてみます。桁が大きくなると見やすくするためによくやりますよね。

画像2

すると、CSVファイルは、

Fruits,A,B
Apple,"1,000","2,000"
Orange,"2,000","1,000"
Grape,"1,500",500
Banana,"3,000","4,000"
"Water
melon","2,000","2,000"

となります。そもそもそれぞれのセルをコンマで区切っていたので、そのままだと桁を表すコンマなのか区切りのコンマなのかわからなくなりますよね。したがって、数値もダブルクォーテーション(")で囲まれます。これを読み込むためには、行単位で処理をするのではなく、カンマがきたら次の列のデータ、改行がきたら次の行のデータを読む、という処理に加えて、ダブルクォーテーションがきたら次のダブルクォーテーションまでカンマも改行も含めてデータとして読み込み、ダブルクォーテーションの次に改行コードならその行のデータの読み込みは終了する、といった処理を追加することになります。
 このように、どんなタイプのファイルでも読めるようにプログラミングしてもいいですが、ちょっと煩雑です。また、自分で書かずに、誰かが作ったCSVファイルを読み込むツールを使ってもいいでしょう。一番ラクなのは、データに桁区切りコンマを入れない、改行を入れない、という制約にして、簡単にプログラミングすることです。その場合、最初に示したスタイルとして扱うことができます。その際、使う人に「桁区切りコンマ、改行を入れない」と念を押す必要があります。自分自身でも忘れてしまいがちです。
 CSVファイルを読むだけのこんなに単純な例でも、プログラマーは1度は失敗して、人知れず苦労をしているのです。

4. 落とし穴


この記事が気に入ったらサポートをしてみませんか?