CSVファイルを読み込むには

◆PROCESSING 逆引きリファレンス

 カテゴリー:ファイル操作

CSVファイルを読み込むには

【解説】

事務系のプログラムやビジネスプログラムを作成していると、時々CSVファイルを使いたい場面に出会います。

みなさんもよくご存知の通り、CSVファイルとはいろいろな文字列データを半角カンマ( , )で区切って並べたテキストファイルの事です。


例えば上記のような感じですね。1行毎に改行しながら、文字列データが並べられています。

大量のデータをプログラムで処理する場合はAccessやPostgreSQLなどのDBを使う方が良いのでしょうが、ちょっとしたデータを扱うだけで良いなら、CSVファイルは手軽でとても便利です。

またCSVファイルの仲間には、文字列データを半角カンマではなくてタブ文字(TAB)で区切った TSV と呼ばれるファイルもあります。

PROCESSINGにはCSVやTSVを簡単に扱える命令と、それを扱うのに適したTableという独自のクラスが用意されています。

まずはCSVやTSVファイルを読み込む方法を紹介しましょう。

【構文】

Table  tbl  =  loadTable(  String  filename ) ;
Table  tbl  =  loadTable(  String  filename ,  String  options ) ;

【パラメータ】

tbl   : データを格納したTableクラスのインスタンス変数
filename  : CSVまたはTSVファイル名
options    :     読み込みオプション。以下の指定が可能です。

“csv”     : filename をCSVファイルと見なして読み込みます。
“tsv”      : filenameをTSVファイルと見なして読み込みます。
“header” : filenameの1行目をヘッダと見なします。

ファイル形式とヘッダー指定を同時に行う(CSVファイルで、かつ1行目がヘッダなど)には、”header,csv” などと記述します。

 

【注意】

ファイルの場所について

filename のパスを省略すると、該当ファイルはスケッチ格納フォルダの data フォルダ配下にあるものとして扱われます。

指定されたファイルが見つからない場合、loadTable() 命令は null を戻します。ファイルが読み込めた場合は、Tableクラスのインスタンス変数が戻されます。

 

ファイル形式について

指定されたファイルがCSV形式とTSV形式のどちらなのかについては、options に指定された形式で判断されます。

options に形式が指定されていない場合や、options引数を省略した場合は、 filename につけられた拡張子で判断されます。

tbl  =  loadTable(  “hoge.csv”  ) ; なら 、拡張子が “.csv” なので、CSV形式
tbl  =  loadTable(  “uha”,  “tsv”  ) ;   なら、optionsが “tsv” なので TSV形式
tbl  =  loadTable(  “uho.tsv”, “csv”  ) ;  なら、optionsを優先してCSV形式
です。

特に3番目の例(ファイル拡張子と optionsの形式が異なる)場合は注意が必要です。

 

データの数と不整合について

ヘッダを含め、各行のデータの数(カンマやタブで区切られたデータの数)が一致している事がとても重要です。
データの数が異なる行があると、ファイルは読み込めますが、その後の処理(データを取り出す処理)で Null Pointer Exception 例外が発生します。

例外になるCSVファイルの例

 

ファイルの文字コードについて

loadTable() 命令は、読み込むテキストファイルが UTF-8 で書かれているものとして処理します。異なる文字コードで書かれたファイルを読ませると、取り出したデータが文字化けするので注意してください。

 

文字データの囲みについて

CSVやTSVファイルはテキストファイルであるため、含まれているデータの意味が「文字列」なのか「数値」なのか、ファイルを見ただけでは判別できません。

例えば

例1:よくあるCSVファイル

上記例なら、番号や体重の項目は数値、その他の項目は文字列ですが、コンピュータでは全て文字列として扱われてしまいます。

そこで文字列を半角のダブルクォーテーション(”)や、半角のシングルクォーテーション(’)で囲み、数値とは区別する方法が使われる事があります。

例2:ダブルクォーテーションで囲みをつけたCSVファイル

こんな感じですね。

これを読み込む際に、ダブルクォーテーションで囲まれているものは文字、そうでないものは数値として処理します。

ところが上記のようなファイルを loadTable() 命令で読み込ませるには注意が必要です。

なぜなら、loadTable() 命令は「CSVファイルに半角のダブルクォーテーション(”)が、データとして含まれている事を許していない」からです

ですので、上記例2のCSVファイルを loadTable() 命令で読み込ませると、「Error  reading table」例外が発生し、読み込みに失敗するのです。・・・なんて仕様だ!と思いますが、しょうがありません。

文字列を囲みたい場合は、シングルクォーテーションで囲む必要があります。

例3:シングルクォーテーションで囲みをつけたCSVファイル

これなら読み込むことが可能です。

ただしデータを取り出すと、各データがシングルクォーテーション付きで取り出される事に注意してください。上記例なら、「ジョン」は「’ジョン’」として取り出されます。

また文字列をシングルクォーテーションで囲むのがOKだとはいえ、シングルクォーテーションの中にダブルクォーテーションを使う事もNGです。

例4:シングルクォーテーションとダブルクォーテーションのCSVファイル

上記例4では、「秋田犬」の箇所が「 ‘秋 “田” 犬’」になっているため、同じく「Error  reading table」例外となってしまいます・・・(泣)。

どうしてもデータの中にダブルクォーテーションを使いたい場合は、CSVファイルではなくTSVファイルで記述する事で回避可能です。

Tableインスタンスに読み込んだ状態からデータを取り出す方法は「CSVデータを取り出すには」記事を参照してください。

 

【関連記事】


サンプルプログラム

ヘッダー有りで読み込む例:

loatTable() の第2引数に “header” を指定して、CSVファイルの先頭行をヘッダ(項目名の列)として読み込ませています。


上記CSVファイル(TestCsv.csv)はdataフォルダ配下にある事が前提です。CSVファイルをヘッダ有りで読み込ませた場合、結果は以下のように表示されます。

loadTable( fileName,  “header” ) ;  を loadTable( fileName );  とした場合、先頭行(Number, Name,…と書かれた行)もデータとして扱われるため、行数は2と表示されます。

<出力サンプル>

 


PROCESSING逆引きリファレンス一覧 へ戻る

本ページで利用しているアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。