簡単に変換できる!PHPでCSVファイルを読み込む方法【初心者向け】現役エンジニアが解説
プログラミング初心者向けにPHPで書くCSVファイルを読み込む方法について解説しています。とても簡単にCSVファイルの読み込みができるので、書きながら理解しましょう。実際にソースコードを書いて説明しています。
テックアカデミーマガジンは受講者数No.1のプログラミングスクール「テックアカデミー」が運営。初心者向けにプロが解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。 ※ アンケートモニター提供元:GMOリサーチ株式会社 調査期間:2021年8月12日~8月16日 調査対象:2020年8月以降にプログラミングスクールを受講した18~80歳の男女1,000名 調査手法:インターネット調査
PHPでCSVファイルを読み込む方法について、テックアカデミーのメンター(現役エンジニア)が実際のコードを使用して初心者向けに解説します。
fgetcsv関数を使ってCSVファイルを読み込めば、表計算ソフトなどからPHPにデータを取り込めます。
たとえば、Excelで作った商品リストをCSVファイルで保存し、PHPで取り込めばショッピングサイトのデータとして活用できますし、Googleスプレッドシートで作成したタスクリストをCSVにしてPHPで読み込めばタスクの共有ができるアプリケーションが作成できます。
このように、他のアプリで作ったCSVファイルのデータ活用するために覚えておきたい知識なので、参考にしてみてください。
目次
そもそもPHPについてよく分からないという方は、PHPとは何なのか解説した記事を読むとさらに理解が深まります。
今回はCSVファイルをPHPで読み込む方法をやっていくよ。
田島メンター!その前にちょっといいですか?
「CSV」って何ですか?
じゃあ、CSVとは何かを教えるね。
ゆかりちゃんは表計算ソフト、例えば「Excel」とか「Google スプレッドシート」は使ったことあるかな?
それならありますよ。大学時代にレポート作成でExcelを使ってましたし、仕事ではGoogle スプレッドシートを使っています。
もし、ゆかりちゃんが入力したデータをPHPのプログラムで読み込ませたいと思ったらどうしたらいいかな?
データを保存したファイルをPHPで読み込めばいいんじゃないですか?
PHPってファイルの読み込みもできましたよね?
たしかに、PHPではファイルの読み込みができるんだけど、ExcelやGoogle スプレッドシートの専用ファイルはそのままでは読み込むのが難しいんだ。
PHPのファイル読み込みは、標準では文字だけで構成されたテキストファイルで作成されていることが前提だからね。
そうなんですね・・・。じゃあ、表計算ソフトで保存するときPHPでも読み込めるテキストファイルの形式で保存したらいいんですか?
その通り!さすがゆかりちゃん、理解が早い。
そのPHPにも対応しているテキストファイルの形式の1つがCSVファイルというわけだね。
なるほどぉ。
今Google スプレッドシートでCSVの形式にエクスポートしてみました。
カンマ付きのシンプルな文字だけになるんですね。
Googleスプレッドシートの画面
名前,年齢,血液型 太郎,21,O ジョン,23,A ニキータ,32,AB 次郎,22,B
CSVファイルの中身
そうだね。CSVファイルはカンマかタブ文字で区切られるんだ。
ちなみにCSVファイルはほとんどのアプリが対応しているから、PHPなどのプログラムからの読み込みだけでなく、アプリ同士でデータをやり取りしたいときにもよく使われるよ。
ただ、データの中身の文字だけしか保存されないから、罫線や文字色などの情報はなくなるけどね。
CSVについてはよく分かりました!
今回はそのCSVファイルをPHPで読み込む方法を教えてもらえるんですね!
そういうことだね。
CSVは、読み込みと出力のそれぞれ書き方が違うから、今回は「読み込み」の方法について説明するね!
お願いしまーす!!
CSVファイルを読み込む関数「fgetcsv」
PHPでは、CSVファイルを読み込んで配列の形にしてくれる「fgetcsv関数」という関数があります。
fgetcsv関数を使うためには、まず対象のCSVファイルを開いておく必要があります。
ファイルを開く「fopen」
CSVファイルを開くには、fopen関数を使います。
$file_handler = fopen("読み込むCSVファイルのパス", "r");
fopen関数の戻り値で、読み込んだファイルを管理している名前(ファイルハンドル)を取得します。
fopen関数の2つ目のパラメータはファイルにアクセスする形式、つまり開いたファイルの書き込みを可能にするかどうかなどのファイルをアクセスする状態を設定します。
“r“は読み取り専用、つまり書き込みしない状態でファイルを開きます。
※もし、対象ファイルが存在しなかったりファイルのアクセス権がない場合には、fopenは失敗しwarningを発行してFALSEを戻り値として返します。
CSVファイルを1行ずつ配列で読み込む「fgetcsv」
ファイルハンドルが取得できたら、fgetcsv関数でCSVファイルを1行ずつ読み込みます。
$data = fgetcsv($file_handler);
読み込まれた1行分のデータを項目(データ列)ごとに配列として戻り値で取得します。
たとえば下記のようなCSVファイルなら、1回目にfgetcsv関数を呼び出したときは、1行目のデータである「名前」「年齢」「血液型」の文字列が配列に代入されます。
名前,年齢,血液型 太郎,21,O ・ ・ ・
実際に書いてみよう
では実際にプログラムを書いてみましょう。
事前に、以下のように書いた「test.csv」ファイルを作成しておきます。
名前,年齢,血液型
太郎,21,O
ジョン,23,A
ニキータ,32,AB
次郎,22,B
それでは、プログラムを書いてみましょう。
<?php
// 読み取り専用でtest.csvを開きます。
$f = fopen("./test.csv", "r");
// test.csvの行を1行ずつ読み込みます。
while($data = fgetcsv($f)){
// 読み込んだ結果を表示します。
var_dump($data);
}
// test.csvを閉じます。
fclose($f);
?>
簡単にソースコードの説明をします。
最初に読み取り専用でtest.csvファイルを開き、while文で1行ずつファイルを読み込みます。
読み込んだ結果の配列を、var_dump関数でCSVファイル1行分のデータを表示しています。
以下、実行結果です。
1行ずつ読み込まれて、配列の形になっているのがわかります。
まとめ
CSVファイルを読み込むときは、まずfopen関数でファイルを開きます。
そして、fgetcsv関数を使って1行ずつ配列にデータを読み込みます。
タブ文字で区切られたファイル
田島メンター、教えてもらった方法でデータをPHPで読み込もうとしたんですがうまくいきません・・・
それは、データの区切り文字が違うからだよ。
CSVはカンマ区切りだけど、別の種類でタブ区切りのファイル形式が使われることがあるんだ。
そうなんですね。よく見るとファイルの拡張子が.tsvになっていました。
そうだね。タブ区切りのファイルはtxtやtsvといった拡張子が使われるね。
タブ区切りのファイルを読み取るにはさっきと同じfgetcsv関数が使えるけど、パラメータを指定する必要があるよ。
タブ区切りのファイルでも読み込めるんですね。
PHPで読み込む方法を教えてください!
fgetcsv関数でタブ区切りのファイルを読み込む
fgetcsv関数でタブ区切りのファイルを読み込むには、3つ目のパラメータseparatorで区切り文字を指定します。
$data = fgetcsv($f, 0, "t")
今回はタブ区切りのファイルを読み込みたいので、区切りとしてタブ文字「t」を指定します。
※2つ目のパラメータはlengthで、分割しない1行の最大文字数(改行文字なども含む)を指定します。0を指定するか省略すると、最大行長は制限されません。 (PHP 5.1.0以降)
まとめ
タブ区切りのファイルをfgetcsv関数で読み込むときは、3つ目のパラメータでタブ文字 “t” を指定します。
[PR] PHPを学んで未経験からWebエンジニアを目指す方法とは
空行がある場合
CSVファイルを読み込んだら、値が空の配列が混じっていました。
それは読み込んだCSVに空の行が入っていたからなんだ。
1行ずつ繰り返すループの中で、空行かどうか判定する式を追加するだけで解決できるよ。
CSVファイルの読み込み時に空行の判定をする
CSVファイルに空の行が含まれている場合、PHPの条件式で判定を行うコードを追加すれば、余分な空っぽの値が配列に入るのを防げます。
配列の1行分の要素すべてが空かどうか、配列の要素を文字列としてつなげて判定します。
1行分の配列の要素を文字列として結合するのに、implode関数を使います。
空行判定のコード例
配列に値があるかどうかで空行の判定をしています。
<?php
// 読み取り専用でtest.csvを開きます。
$f = fopen("test.csv", "r");
// test.csvの行を1行ずつ読み込みます。
while($data = fgetcsv($f)){
// 1行分の要素すべてを文字列として結合しても空ではない、つまり空行でなければ出力します。
if(implode($data) != null){
// 読み込んだ結果を表示します。
var_dump($data);
}
}
// test.csvを閉じます。
fclose($f);
?>
※空行の判定には配列そのものが空かどうかではなく、配列の要素がnullかどうかを判定します。
まとめ
fgetcsv関数で読み込んだ配列の要素すべてがnullなら空行です。
まとめ
fgetcsv関数を利用することで自分で実装するよりも簡単にCSVファイルを展開できます。
CSVファイルを読み込む場面は多いかと思いますので、ぜひ活用してください。
CSVファイルは、自社でサービス運営とかしていたらよく使うと思うから、覚えておくと便利だよ〜!
そうなんですね!
今回は、CSVファイルをPHPファイルに記述する形だったけど、逆にPHPファイルの中身をCSVファイルとして出力する方法も紹介するから両方覚えてみてね!
ありがとうございました♪
PHPを学習中の方へ
これで解説は終了です、お疲れさまでした。
- つまずかず「効率的に」学びたい
- 副業や転職後の「現場で使える」知識やスキルを身につけたい
プログラミングを学習していて、このように思ったことはありませんか?
テックアカデミーのPHP/Laravelコースでは、第一線で活躍する「プロのエンジニア」が教えているので、効率的に実践的なスキルを完全オンラインでしっかり習得できます。
合格率10%の選考を通過した、選ばれたエンジニアの手厚いサポートを受けながら、PHP/Laravelを使ったWebアプリケーション開発を学べます。
まずは一度、無料体験で学習の悩みや今後のキャリアについて話してみて、「現役エンジニアから教わること」を実感してみてください。
時間がない方、深く知ってから体験してみたい方は、今スグ見られる説明動画から先に視聴することをおすすめします!