◆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 例外が発生します。
ファイルの文字コードについて
loadTable() 命令は、読み込むテキストファイルが UTF-8 で書かれているものとして処理します。異なる文字コードで書かれたファイルを読ませると、取り出したデータが文字化けするので注意してください。
文字データの囲みについて
CSVやTSVファイルはテキストファイルであるため、含まれているデータの意味が「文字列」なのか「数値」なのか、ファイルを見ただけでは判別できません。
例えば
上記例なら、番号や体重の項目は数値、その他の項目は文字列ですが、コンピュータでは全て文字列として扱われてしまいます。
そこで文字列を半角のダブルクォーテーション(”)や、半角のシングルクォーテーション(’)で囲み、数値とは区別する方法が使われる事があります。
こんな感じですね。
これを読み込む際に、ダブルクォーテーションで囲まれているものは文字、そうでないものは数値として処理します。
ところが上記のようなファイルを loadTable() 命令で読み込ませるには注意が必要です。
なぜなら、loadTable() 命令は「CSVファイルに半角のダブルクォーテーション(”)が、データとして含まれている事を許していない」からです。
ですので、上記例2のCSVファイルを loadTable() 命令で読み込ませると、「Error reading table」例外が発生し、読み込みに失敗するのです。・・・なんて仕様だ!と思いますが、しょうがありません。
文字列を囲みたい場合は、シングルクォーテーションで囲む必要があります。
例3:シングルクォーテーションで囲みをつけたCSVファイル
これなら読み込むことが可能です。
ただしデータを取り出すと、各データがシングルクォーテーション付きで取り出される事に注意してください。上記例なら、「ジョン」は「’ジョン’」として取り出されます。
また文字列をシングルクォーテーションで囲むのがOKだとはいえ、シングルクォーテーションの中にダブルクォーテーションを使う事もNGです。
例4:シングルクォーテーションとダブルクォーテーションのCSVファイル
上記例4では、「秋田犬」の箇所が「 ‘秋 “田” 犬’」になっているため、同じく「Error reading table」例外となってしまいます・・・(泣)。
どうしてもデータの中にダブルクォーテーションを使いたい場合は、CSVファイルではなくTSVファイルで記述する事で回避可能です。
Tableインスタンスに読み込んだ状態からデータを取り出す方法は「CSVデータを取り出すには」記事を参照してください。
【関連記事】
サンプルプログラム
ヘッダー有りで読み込む例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Table tbl = null; String fileName = "TestCsv.csv"; void setup(){ //ヘッダ有りでCSVファイルを読む tbl = loadTable( fileName, "header" ); if( tbl != null ){ println( "行数は" + tbl.getRowCount() + "です"); } noLoop(); } void draw(){ } |
loatTable() の第2引数に “header” を指定して、CSVファイルの先頭行をヘッダ(項目名の列)として読み込ませています。
上記CSVファイル(TestCsv.csv)はdataフォルダ配下にある事が前提です。CSVファイルをヘッダ有りで読み込ませた場合、結果は以下のように表示されます。
loadTable( fileName, “header” ) ; を loadTable( fileName ); とした場合、先頭行(Number, Name,…と書かれた行)もデータとして扱われるため、行数は2と表示されます。
本ページで利用しているアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。