データベースの情報をCSVとして、出力したい
ことってありませんか?
PHPにおいて、CSVを処理する方法にはパターンがあります。
今回はCSVを読み込む方法をプログラム例も併せて紹介します。
CSVファイルはコンマで区切られたファイルの形式
そもそもCSVというファイルはどのようなものか、をまず理解しておきましょう。
wikipediaでは、次のようにあります。
comma-separated values(略称:CSV)は、テキストデータをいくつかのフィールド(項目)に分け、区切り文字であるカンマ「
,
」で区切ったデータ形式。
つまり、要素を「,(コンマ)」で区切ったようなファイルがCSVファイルです。
実際にCSVファイルを作ってみる
では、実際にCSVファイルを作ってみます。
まず、Googleスプレッドで以下のようにデータを入力します。
そして、以下のメニューからファイルをダウンロード。
ダウンロードができたら、そのファイルをプログラムを書くエディタなどで開いてみましょう。
するとこのような内容がファイルに書き込まれていることが確認できます。
1 2 3 4 |
No,名前,メールアドレス,住所 1,hoge,hoge@hoge.com,hoge city 2,fuga,fuga@fuga.com,fuga city 3,piyo,piyo@piyo.com,piyo city |
このようにコンマで区切られた要素を一行ずつ持つようなファイルをCSVファイルです。
CSVファイルのメリット
と思う人もいるかもしれません。
そこでCSVファイルを使うメリットを解説していきます。
メリット1: コンマで区切りでわかりやすい
例えば、PHPのプログラムを理解するにはPHPの知識が必要です。
それに比べて、CSVファイルは特別な知識がなくても理解することができます。
先のCSVファイルの内容をもう一度見てみましょう。
1 2 3 4 |
No,名前,メールアドレス,住所 1,hoge,hoge@hoge.com,hoge city 2,fuga,fuga@fuga.com,fuga city 3,piyo,piyo@piyo.com,piyo city |
要素を単純にコンマで区切るというルールを理解するのは容易ですね。
メリット2: CSVファイルで大量のデータを操作できる
CSVファイルは大量のデータを一括で操作するときに便利です。
例えば、システムの機能によくあるのが、CSVファイルをアップロードし、データベースを更新するような機能です。
システムのデータベースを人手で一つひとつ更新するのが大変な場合は、CSVを使うといいです。
メリット3: CSVは表計算ソフトから出力できる
ビジネスで数字を管理する上で表計算ソフトは必ずと言っていいほど利用されています。
例えば、エクセルやGoogleスプレッドシート。
そういったエクセルやGoogleスプレッドシートで管理されているデータは、CSVとしてダウンロードできるようになっています。
そうすると、
ということができるようになります。
CSVを使った一括登録機能
開発において、CSVを使った機能実装するときに多いのは一括登録機能です。
顧客データや、ECサイトの商品データを人手で一つ一つ入力することは運営する側とっては手間になります。
そういった一括で大量の情報を登録する機能を実装するときにCSVファイルです。
例えば、PHP製のEC特化のフレームであるEC CUBEでは、CSVファイルを使った一括商品登録という機能が実装されています。
この機能によりCSVをシステムにアップロードして、システムの商品情報などを一括で登録することが可能です。
CSVを読み込む
ここからはPHPでCSVを読み込む方法を2つ解説していきます。
fopenとfgetcsvを使う
CSVを使ったプログラムを解説する前に、まずは準備です。
CSVファイルは今回はこれを例として使います。
1 2 3 4 |
No,名前,メールアドレス,住所 1,hoge,hoge@hoge.com,hoge city 2,fuga,fuga@fuga.com,fuga city 3,piyo,piyo@piyo.com,piyo city |
ここでは、php_csv.csvというファイル名で保存しておきましょう。
次にプログラムです。
CSVを読み込むプログラムはこのようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// $fileという変数にphp_csv.csvを指定 $file = 'php_csv.csv'; if (($fp = fopen($file, 'r')) === false) { exit; } $i = 0; while (($record = fgetcsv($fp)) !== false) { mb_convert_variables('UTF-8', 'sjis-win', $record); print_r($line); ++$i; } fclose($fp); |
このプログラムの仕様をまとめると、
fgetcsvでファイルを一行ずつ読み込む
mb_convert_variablesで文字コードを変換しながら、画面に出力する
となります。
では、実行して出力結果を確認します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
$ php csv_1.php Array ( [0] => No [1] => 名前 [2] => メールアドレス [3] => 住所 ) Array ( [0] => 1 [1] => hoge [2] => hoge@hoge.com [3] => hoge city ) Array ( [0] => 2 [1] => fuga [2] => fuga@fuga.com [3] => fuga city ) Array ( [0] => 3 [1] => piyo [2] => piyo@piyo.com [3] => piyo city ) |
このようにCSVをPHPのプログラムから読み込むと、CSVの一行ずつの要素を配列として取得できます。
SplFileObject::READ_CSVを使う
SqlFileObjectクラスというファイルを読み込むためのライブラリを使うと、先述したfgetcsvのものより少ないプログラム量で書くことができます。
プログラムはこうです。
1 2 3 4 5 6 7 8 |
$file = 'php_csv.csv'; $file = new SplFileObject($file); $file->setFlags(SplFileObject::READ_CSV); foreach ($file as $line) { print_r($line); } |
出力結果については、fgetcsvを利用したプログラムと同じものなります。
CSVファイルを生成する
次はCSVを生成してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$file = 'php_csv_output.csv'; $file = new SplFileObject($file, 'w'); $records = [ ['No', '名前', 'メールアドレス', '住所'], [1, 'hoge', 'hoge@hoge.com', 'hoge city'], [2, 'fuga', 'fuga@fuga.com', 'fuga city'], [3, 'piyo', 'piyo@piyo.com', 'piyo city'], ]; foreach ($records as $line) { $file->fputcsv($line); } |
ここでのポイントは配列として、CSVファイルに書き込むデータを持っておくことです。
このように配列としてデータをつくることができれば、CSVファイルを作ることができます。
Laravelなどでも、このようにしてCSVファイルを作ることが可能です。
CSVを利用したプログラムでよくあるエラー
CSVなどのファイル操作する機能やプログラムは、シンプルにプログラムのみを書くときよりエラーが起きがちです。
そこでCSVを処理するプログラムを開発するときに、よくあるエラーと対策を解説します。
ファイルが読み込めない、ファイルに書き込めない
CSVを読み込んだり、生成する機能を開発していると、
なぜかファイルに書き込めない。。。
という現象が起きることがあります。
こういうときにすぐにチェックすべきは、ファイルやディレクトリの権限です。
処理するファイルやディレクトリの権限が書き込みができない、読み込みができないようになっているかもしれません。
SplFileObjectクラスが使えない
SqlFileObjectクラスはCSVファイルを処理するうえで使いやすい関数です。
しかし、たまに実行できないことがあります。
そんなときはPHPのバージョンを確認です。
もしかすると、PHPのバージョンが対応していないかもしれません。
SqlFileObjectクラスのリファレンスを確認してみると、PHPが5.1.0以上しか対応していない、とあります。
(PHP 5 >= 5.1.0, PHP 7)
まとめ
いかがでしたか?
今回は、【PHP】CSVを読み込む方法(プログラム例あり!)、についてご紹介しました。これでCSVを処理するプログラムを開発ができます。
ぜひ参考にしてみてくださいね。