今回はPHPでcsvファイルを入出力するための便利な関数について解説します。
PHPに限らず一般的なプログラミング言語ではファイルの入出力の際にはテキストデータを扱います。データを配列などの何らかの形式にしたい場合はそのテキストデータを解析してその形式にするという手順が一般的ですが、PHPではcsvファイルを直接配列として取得する機能が用意されています。しっかり学んで効率的なプログラム開発を目指しましょう。
ざっくりPHP入門(初心者〜中級者向け)目次
fgetcsv関数を使ってcsvファイルを配列として読み込もう
まずはcsvファイルの読み込み方法について解説します。
以下のようなcsvファイルがあったとします。各行に県名がカンマで区切りられたcsvファイルです。ファイル名をfile.csvとしました。
1 2 3 |
北海道,青森県,岩手県,秋田県 茨城県,栃木県,東京都,神奈川県 大阪府,京都府,奈良県,滋賀県 |
これをfgetcsv関数を使って読み込んでみましょう。
基本形は以下となります。fopen関数の第二引数を”r”にすることで読み込み専用としてファイルを開きます。その後fgetcsv関数で1行ずつ読み込んでいきますが、fgetcsv関数から受け取ったデータは配列となります。各行print_r関数で出力させています。
1 2 3 4 5 |
$fp = fopen('file.csv', "r"); while ($line = fgetcsv($fp)) { print_r($line); } fclose($fp); |
結果は以下の通りとなります。各行配列として受け取ったことがおわかりかと思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
Array ( [0] => 北海道 [1] => 青森県 [2] => 岩手県 [3] => 秋田県 ) Array ( [0] => 茨城県 [1] => 栃木県 [2] => 東京都 [3] => 神奈川県 ) Array ( [0] => 大阪府 [1] => 京都府 [2] => 奈良県 [3] => 滋賀県 ) |
csvファイルの中にはカンマ区切りではなく以下のようにタブ区切りのものも存在します。このようなファイルを読み込むにはどのようにしたら良いのでしょうか。
1 2 3 |
北海道 青森県 岩手県 秋田県 茨城県 栃木県 東京都 神奈川県 大阪府 京都府 奈良県 滋賀県 |
fgetcsv関数の第三引数に区切り文字を指定することができます。以下のようにタブを示すエスケープ文字である「\t」を指定するとタブ区切りデータを読み込むことができるわけです。第三引数を指定したことで第二引数も設定が必要になりますが、これが想定されるデータ数よりも多い数を設定してください。
1 2 3 4 5 |
$fp = fopen('file3.csv', "r"); while ($line = fgetcsv($fp, 1000, "\t")) { print_r($line); } fclose($fp); |
次に下記のように各文字列がダブルクォーテーションで括られているデータを扱う方法です。Excelからcsvファイルを生成する場合によく見られる例です。
1 2 3 |
"北海道","青森県","岩手県","秋田県" "茨城県","栃木県","東京都","神奈川県" "大阪府","京都府","奈良県","滋賀県" |
その場合はfgetcsv関数の第四引数で指定することで可能になります。
1 2 3 4 5 |
$fp = fopen('file.csv', "r"); while ($line = fgetcsv($fp, 1000, ",", '"')) { print_r($line); } fclose($fp); |
ちなみに、ダブルクオーテーションは指定しなくてもデフォルトで検知してくれるので実は上記のケースでは第四引数は不要です。あまり見ないケースですがシングルクォーテーションで括られている場合には第四引数で指定してください。
【PHP入門】PHPでforeachを使う方法!fputcsv関数を使って配列をcsv形式に出力しよう
次に配列をcsvファイルに出力する方法について解説します。
以下の例では2重配列$dataをcsvファイルに出力する例になります。fopen関数の第二引数を”w”にすることで書き込み(上書き)専用でファイルを開いてくれます。次に$dataをforeachループで1行ずつfputcsvで出力させています。
1 2 3 4 5 6 7 8 9 10 11 |
$data = array( array('新潟県', '富山県', '石川県', '長野県'), array('兵庫県', '広島県', '島根県', '山口県'), array('福岡県', '宮崎県', '鹿児島県', '沖縄県') ); $fp = fopen('file.csv', "w"); foreach ($data as $fields) { fputcsv($fp, $fields); } fclose($fp); |
このプログラムで生成したcsvファイルは以下のようになります。デフォルトではカンマ区切りとなります。
1 2 3 |
新潟県,富山県,石川県,長野県 兵庫県,広島県,島根県,山口県 福岡県,宮崎県,鹿児島県,沖縄県 |
次にタブ区切りでcsvファイルに出力してみましょう。fputcsv関数の第三引数にタブを示すエスケープ文字「\t」を指定します。
1 2 3 4 5 6 7 8 9 10 11 |
$data = array( array('新潟県', '富山県', '石川県', '長野県'), array('兵庫県', '広島県', '島根県', '山口県'), array('福岡県', '宮崎県', '鹿児島県', '沖縄県') ); $fp = fopen('file2.csv', "w"); foreach ($data as $fields) { fputcsv($fp, $fields, "\t"); } fclose($fp); |
出力されたcsvファイルは以下のとおりです。タブ区切りで保存することができました。区切り文字は1文字という制約はありますが任意に指定することができます。
1 2 3 |
新潟県 富山県 石川県 長野県 兵庫県 広島県 島根県 山口県 福岡県 宮崎県 鹿児島県 沖縄県 |
fputcsv関数を使って配列をcsvファイルの最後に追加しよう
完全に上書きするのではなく、元のファイルの最後に追加する方法について解説します。。
fopen関数の第二引数を”a”にすることで完全な上書きではなくcsvファイルの最後に追加することになります。あとは追加したい配列$dataをfputcsvに渡すだけです。
1 2 3 4 5 |
$data = array('東京都', '埼玉県', '千葉県', '神奈川県'); $fp = fopen('file2.csv', "a"); fputcsv($fp, $data); fclose($fp); |
以下の通りファイルの最後にカンマ区切りでデータが追加されました。
1 2 3 4 |
新潟県,富山県,石川県,長野県 兵庫県,広島県,島根県,山口県 福岡県,宮崎県,鹿児島県,沖縄県 東京都,埼玉県,千葉県,神奈川県 |
まとめ
いかがでしょうか。今回はPHPでcsvファイルを入出力する方法について解説しました。
ファイルの読み込み時に文字列データではなく配列として出力したり、配列を何も文字列処理することなくcsvに直接書き込めることがおわかりいただけたかと思います。しっかり学んで効率的なプログラム開発を目指しましょう。
PHPによるCSVファイルの読み込み手順を解説