PHP で CSV ファイルを読み書きする方法(fgetcsv, fputcsv)初心者向けガイド!
新人
「CSVファイルって何ですか?PHPでどう使うんですか?」
先輩
「CSVファイルは、データをカンマで区切って保存する形式のファイルです。PHPでは、fgetcsv()やfputcsv()を使って、CSVファイルの読み書きができます。」
新人
「それは便利そうですね!具体的にはどうやって使うんですか?」
先輩
「では、まず基本的な使い方を見ていきましょう!」
1. CSVファイルとは?(初心者向けにわかりやすく解説)
CSVファイルは「Comma Separated Values」の略で、日本語では「カンマで区切られた値」という意味になります。その名の通り、データを「,(カンマ)」で区切って保存する非常にシンプルなファイル形式です。
プログラミング未経験の方でも、Excel(エクセル)の表をイメージすると分かりやすいでしょう。例えば、以下のような名簿データがあるとします。
名前,年齢,出身地
田中,25,東京都
佐藤,30,大阪府
鈴木,22,愛知県
このように、1行が「1件のデータ」を表し、項目ごとにカンマで区切られています。CSVファイルが世界中で使われている理由は、「互換性の高さ」にあります。特定のソフトに依存しないテキスト形式(.txtなどと同じ仲間)なので、メモ帳で中身を確認したり、Excelで開いて編集したり、今回学習するようにPHPなどのプログラムで読み書きしたりすることが非常に簡単です。
住所録や売上管理、アンケート結果の集計など、大量の「表形式データ」を扱う際の標準的なフォーマットとして、Web開発の現場でも欠かせない存在となっています。
2. PHPでCSVファイルを読み書きする方法(fgetcsv, fputcsv)
PHPでCSVデータを扱う際、最も基本となるのがfgetcsv()とfputcsv()という2つの関数です。初心者の方でも、ファイルを開く・処理する・閉じるという3つのステップを意識すれば、簡単にマスターできます。まずは、実際のファイルからデータを1行ずつ取り出す「読み込み」の方法から解説します。
CSVファイルを読み込む(fgetcsv)
プログラムがCSVファイルを読み込むときは、まず「ファイルを開く(fopen)」作業が必要です。以下のサンプルは、未経験の方でも理解しやすい標準的な読み込み処理です。
<?php
// 1. ファイルを読み取り専用(r)で開く
$file_path = "sample.csv";
if (($handle = fopen($file_path, "r")) !== FALSE) {
// 2. 1行ずつ配列として読み込む
// fgetcsvの第2引数は最大文字数、第3引数は区切り文字
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
// 読み込んだ配列の中身を表示
echo "名前: " . $data[0] . " / 年齢: " . $data[1] . " / 住所: " . $data[2] . "<br>";
}
// 3. 使い終わったらファイルを閉じる
fclose($handle);
} else {
echo "ファイルを開くことができませんでした。";
}
?>
このコードでは、sample.csvという名簿のようなファイルからデータを取り出し、画面に表示させています。fgetcsv()が実行されるたびに、プログラムは「次の行」へと自動的に進んでくれるため、ループ処理(while文)との相性が抜群です。
CSVファイルに書き込む(fputcsv)
次に、既存のファイルに新しいデータを追記したり、新しくCSVを作成したりする「書き込み」の方法を見てみましょう。配列を用意するだけで、PHPが自動的にカンマ(,)で区切って保存してくれます。
<?php
// 追加したいデータを配列で作る
$new_member = array('田中', '25', '東京');
// 1. ファイルを追記モード(a)で開く
if (($handle = fopen("sample.csv", "a")) !== FALSE) {
// 2. 配列をCSV形式で書き込む
fputcsv($handle, $new_member);
// 3. ファイルを閉じる
fclose($handle);
echo "データの書き込みが完了しました。";
}
?>
書き込みのポイントはfopenの第2引数に指定した"a"(追加:Append)です。これを使うことで、元々あるデータを消さずに、一番下の行へ新しい情報を追加できます。Excelで手入力するような作業を、PHPなら一瞬で自動化できるのがこの機能の強みです。
3. fgetcsv()を使ったCSVファイルの読み込み例(初心者向けの簡単なコード)
PHPでCSVファイルを読み込む際、最も一般的で確実な方法がfgetcsv()関数を使うことです。プログラミングが初めての方でも分かりやすいよう、具体的なステップに分けて解説します。
準備:読み込むCSVファイルの内容
まずは、読み込みのテスト用として「sample.csv」という名前のファイルを用意しましょう。中身は以下のような、名前・年齢・住所が並んだシンプルなデータです。
田中,25,東京
佐藤,30,大阪
鈴木,22,名古屋
実践:PHPでCSVを1行ずつ読み込む
次に、このファイルを読み込んで画面に表示させるPHPコードを書きます。ファイルを開く(fopen)、中身を取り出す(fgetcsv)、ファイルを閉じる(fclose)という3つの手順が基本セットです。
<?php
// 1. ファイルを「読み込みモード(r)」で開く
$handle = fopen("sample.csv", "r");
if ($handle !== FALSE) {
// 2. while文を使って、データの終わりまで1行ずつループ処理する
// fgetcsvの戻り値が配列($data)になり、データがなくなるとFALSEを返します
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
// $data[0]には1列目(名前)、$data[1]には2列目(年齢)が入っています
echo "名前: " . $data[0] . " / ";
echo "年齢: " . $data[1] . "歳 / ";
echo "場所: " . $data[2] . "<br>";
}
// 3. 使い終わったファイルを閉じる
fclose($handle);
} else {
echo "ファイルを開くことができませんでした。";
}
?>
fgetcsv()の便利なところは、カンマ区切りのデータを自動的に「配列」という箱に小分けしてくれる点です。例えば、一行目の「田中,25,東京」を読み込むと、$data[0]に"田中"、$data[1]に"25"といった形で、番号を指定するだけで特定のデータを取り出せるようになります。
この基本構造さえ覚えれば、顧客リストや商品管理などの膨大なCSVデータも、一瞬でWebサイト上に表示させたり、データベースに保存したりすることが可能になります。
4. fputcsv()を使ったCSVファイルの書き込み例(初心者向けに詳しく解説)
PHPで新しくCSVファイルを作成したり、データを保存したりする際に最もよく使われるのがfputcsv()関数です。この関数は、配列(データのまとまり)を渡すだけで、自動的にカンマ区切りに整えて書き込んでくれる非常に便利な仕組みを持っています。
まずは1行だけ書き込んでみよう
プログラミング未経験の方でも分かりやすいよう、まずは「1人分のデータ」を新しく作成したファイルに保存する最小限のコードを見てみましょう。
<?php
// 保存したいデータを配列(リスト)にする
$data = array('田中', '25', '東京');
// "w"モード(書き込み専用)でファイルを開く
if (($handle = fopen("new_sample.csv", "w")) !== FALSE) {
// データをCSV形式で書き込む
fputcsv($handle, $data);
// 最後に必ずファイルを閉じる
fclose($handle);
echo "CSVファイルの作成が完了しました。";
}
?>
このプログラムを実行すると、実行ファイルと同じ場所にnew_sample.csvという名前のファイルができあがり、中身を確認すると「田中,25,東京」と記載されています。ここで重要なのは、fopenの第2引数に指定した"w"です。これは「上書きモード」を意味し、実行するたびに中身が新しく作り直されます。
複数のデータをまとめて書き込む方法
実際のWebサイトでは、会員リストや売上データなど、複数の行を一度に書き込むことがほとんどです。その場合は、データの数だけfputcsv()を繰り返し呼び出すだけで、自動的に改行して次の行に書き込んでくれます。
<?php
// 複数のデータを用意する
$users = [
['田中', '25', '東京'],
['佐藤', '30', '大阪'],
['鈴木', '22', '福岡']
];
if (($handle = fopen("user_list.csv", "w")) !== FALSE) {
// 1行ずつ取り出して書き込む
foreach ($users as $user) {
fputcsv($handle, $user);
}
fclose($handle);
}
?>
このように、fputcsv()は面倒な「カンマの挿入」や「行末の改行」をすべて自動で行ってくれるため、初心者でも安全にCSV操作が可能です。もし文字化けが発生した場合は、保存する前に文字コードを変換する処理を追加しますが、基本はこの形をマスターすればOKです。
5. CSVファイルの読み書きにおける注意点
CSVファイルを読み書きする際には、いくつかの注意点があります。これらを理解しておくことで、より効率的で安全にCSVファイルを操作できます。
- ファイルの存在確認:読み込む前にCSVファイルが存在するか確認することが重要です。存在しないファイルを読み込もうとするとエラーになります。
- ファイルの書き込み権限:書き込むファイルに対して適切な書き込み権限があるかを確認しましょう。権限がないとファイルの書き込みが失敗します。
- ファイルを閉じる:ファイルを開いた後は、必ず閉じることが大切です。ファイルを開いたままにしておくと、システムリソースが無駄に消費されることがあります。
- CSVのエンコーディング:ファイルのエンコーディング(文字コード)に注意しましょう。例えば、UTF-8とShift-JISでは文字化けが起きることがあります。
以上の点を注意して、CSVファイルを安全に操作しましょう。ファイルの読み書きがスムーズに行えるようになります。
6. fgetcsv()とfputcsv()の使い分け(どちらを使うべきか)
CSVファイルの操作にはfgetcsv()とfputcsv()の2つの関数を使用しますが、それぞれの役割と使いどころを理解することが大切です。
fgetcsv()は、CSVファイルを読み込むための関数です。CSVファイルの内容を1行ずつ配列として取り出すことができます。主にデータを取得したいときに使用します。
一方、fputcsv()は、CSVファイルにデータを追記または上書きするための関数です。データをファイルに保存したい場合に使用します。
例えば、CSVファイルに新しいデータを追加する場合はfputcsv()を使用し、ファイルからデータを読み込みたい場合はfgetcsv()を使用します。
以下は、fgetcsv()とfputcsv()の使い分けの一例です。
<?php
// CSVファイルからデータを読み込む例
if (($handle = fopen("data.csv", "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
// ここでデータを処理
echo implode(", ", $data) . "<br>";
}
fclose($handle);
}
// CSVファイルにデータを追加する例
$newData = array('佐藤', '28', '京都');
if (($handle = fopen("data.csv", "a")) !== FALSE) {
fputcsv($handle, $newData);
fclose($handle);
}
?>
上記のコードでは、fgetcsv()でCSVファイルを読み込んで表示し、fputcsv()で新しいデータをCSVファイルに追加しています。
7. 実践!CSVファイルを使ったアプリケーションの例
ここでは、CSVファイルを使った簡単なアプリケーションを作成してみましょう。ユーザーが入力したデータをCSVファイルに保存し、それを後で表示する機能を実装します。
まず、ユーザーから名前、年齢、都道府県を入力させるフォームを作成します。
<form action="save_data.php" method="POST">
<label for="name">名前:</label><br>
<input type="text" id="name" name="name"><br>
<label for="age">年齢:</label><br>
<input type="text" id="age" name="age"><br>
<label for="city">都道府県:</label><br>
<input type="text" id="city" name="city"><br><br>
<input type="submit" value="データを保存">
</form>
次に、フォームのデータを受け取り、CSVファイルに保存するPHPコードを作成します。
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$name = $_POST['name'];
$age = $_POST['age'];
$city = $_POST['city'];
$data = array($name, $age, $city);
// CSVファイルにデータを書き込む
if (($handle = fopen("user_data.csv", "a")) !== FALSE) {
fputcsv($handle, $data);
fclose($handle);
echo "データが保存されました!";
} else {
echo "データの保存に失敗しました。";
}
}
?>
このコードでは、フォームから送信された名前、年齢、都道府県をCSVファイルに保存します。新しいデータはCSVファイルの末尾に追加されます。
8. CSVファイルの読み書きを行う際のベストプラクティス
CSVファイルを安全かつ効率的に操作するためには、いくつかのベストプラクティスを守ることが重要です。以下は、CSVファイルを読み書きする際のポイントです。
- ファイルを開く際のモードに注意:ファイルを開くときは、読み込み専用、書き込み専用、追加モードなどの適切なモードを選びましょう。
fopen()関数でファイルを開く際には、モードを間違えないようにしましょう。 - ファイルの存在確認:ファイルが存在しない場合は、新しく作成するかエラーメッセージを表示するようにしましょう。
- ファイルの閉じ忘れに注意:ファイルを開いたら、必ず
fclose()で閉じるようにしましょう。閉じ忘れるとリソースが無駄に消費され、システムのパフォーマンスに影響を与える可能性があります。 - CSVデータの検証:CSVファイルを読み書きする前に、データの検証を行い、データが正しい形式であることを確認することが重要です。
- 適切なエラーハンドリング:ファイル操作中にエラーが発生した場合、エラーメッセージを表示し、問題を解決するための適切な処理を行いましょう。
これらのベストプラクティスを守ることで、CSVファイルの読み書きがより安全かつ効率的に行えるようになります。
まとめ
今回はPHPでCSVファイルを読み書きする方法として、fgetcsv()とfputcsv()の使い方について丁寧に解説しました。CSVファイルは、データをカンマで区切って保存できるシンプルで扱いやすい形式です。住所録やアンケート結果、商品一覧など、構造化されたデータを保存するのに最適で、ExcelやGoogleスプレッドシートとも互換性があります。
PHPでCSVファイルを扱う場合、fgetcsv()を使えば一行ずつ配列として読み込むことができ、fputcsv()を使えば配列のデータをCSVファイルに保存することができます。ファイル操作にはfopen()とfclose()を組み合わせ、読み込み時には"r"モード、書き込み時には"w"や"a"モードを選択するのが基本です。
実践例として、CSVファイルにデータを追加し、それを読み込んで表示する流れも紹介しました。フォームを通じてユーザーから情報を取得し、その情報をCSVファイルに記録する処理は、実際のWebアプリケーション開発でも非常によく使われるパターンです。
また、CSVファイルを操作する際には、エンコーディングの違いやファイル権限、ファイルの存在確認などにも注意が必要です。Shift-JISで保存されたCSVをUTF-8環境で読み込むと文字化けが起こる場合があるため、実際の運用ではmb_convert_encoding()の活用も検討すると良いでしょう。
読み込みと書き込みの処理を確実に分けて考えることで、CSVの取り扱いが明確になります。たとえば、顧客データを一覧表示する画面ではfgetcsv()、新規登録フォームからの保存にはfputcsv()を使い分けるイメージです。
これらの関数は非常に強力ですが、ファイル処理という性質上、例外処理やエラー制御もセットで意識することが大切です。ファイルが存在しなければ新しく作る、書き込み権限がなければエラーを通知する、読み込んだデータが正しく整形されているかチェックするといった基本的な配慮が、安定したアプリケーション開発に繋がります。
初心者にとって、CSVファイルを使ったデータ操作は学習の第一歩としてとても良い題材です。データの構造を意識しながら、配列とファイルの関係を理解することができ、PHPの基礎的なファイル操作にも慣れることができます。
最後に、実際にCSVファイルを使ってミニアプリケーションを作る体験は、知識の定着にも効果的です。フォームから名前や年齢、都道府県などの情報を入力し、それをCSVファイルに保存して一覧表示する処理は、実践的なスキルに直結します。
本記事で紹介したfgetcsv()とfputcsv()を活用すれば、PHP初心者でもCSVファイルを扱ったデータ管理の基礎を確実に習得できます。ぜひ、自分なりのデータアプリケーションを作って試してみてください。
新人
「今日学んだことで、CSVファイルって実はテキストファイルだったって知ってびっくりしました!」
先輩
「そうなんだよ。カンマで区切られているだけのシンプルな構造だから、扱いやすいし、Excelとも相性が良いんだ。」
新人
「PHPで読み込むときはfgetcsv()を使って1行ずつ取り出せるし、書き込むときはfputcsv()で配列をそのまま保存できるって便利ですね!」
先輩
「その通り。あとはファイルを開くときのモードと、閉じ忘れに注意すれば安心だね。」
新人
「あと、データをCSVに保存する実践的なフォーム処理もとても参考になりました。簡単なアプリ作れそうな気がしてきました!」
先輩
「うん、それが一番の学びだね。自分で書いて動かして、ファイルに保存して、また読み込んで…それがPHPの基礎力になるよ。」
新人
「次はCSVの中身を検索したり、編集したりもやってみたいです!」
先輩
「それもfgetcsv()で読み込んだ後、配列を加工すればできるよ。ぜひチャレンジしてみてね!」