PHPのCSVファイルの読み書きと文字列処理を基礎から解説!初心者向けガイド
生徒
「先生、PHPでデータをCSVファイルに保存したり、読み込んだりすることってできますか?」
先生
「もちろんできますよ!CSV(シーエスブイ)ファイルは、Excel(エクセル)みたいに表形式でデータを扱えるテキストファイルのことです。」
生徒
「なるほど…。でも難しそうですね。初心者でもできるんですか?」
先生
「安心してください。PHPでは、fopenやfputcsv、fgetcsvといった関数を使えば、簡単にCSVの読み書きができます。それでは一緒に見ていきましょう!」
1. CSVファイルとは?Excelと何が違うの?
CSVファイルとは、正式名称を「Comma Separated Values(カンマ・セパレーテッド・バリューズ)」といいます。日本語に直訳すると「カンマ(,)で区切られた値」という意味です。その名の通り、複数のデータをカンマで区切って並べた非常にシンプルなテキスト形式のファイルです。
<p>たとえば、会員名簿や商品の在庫リストなどをイメージしてみてください。CSVの中身をテキストエディタ(メモ帳など)で開くと、以下のようになっています。</p>
名前,年齢,メールアドレス
山田太郎,25,taro@example.com
鈴木花子,30,hanako@example.com
このように、見た目はただの文字の羅列ですが、コンピュータにとっては「カンマがあるところでデータが分かれているんだな」と理解しやすい構造になっています。
Excel(エクセル)との違いは?
Excelファイル(.xlsx)は、文字の色や太さ、セルの結合といった「見た目」の情報も保存されます。対してCSVは「データそのもの」しか持ちません。そのため、ファイルサイズが非常に軽く、プログラミング言語であるPHPとの相性が抜群です。銀行の取引明細やネットショップの売上データなど、大量の情報を一括で処理する際には、必ずといっていいほどこのCSV形式が使われます。
一見するとただの文字に見えますが、Excelでこのファイルを読み込めば、自動的にカンマの位置で区切られて、きれいな表形式として表示されます。つまり、「データのやり取りに特化した、世界共通の便利なメモ帳」だと考えると分かりやすいでしょう。
2. PHPでCSVファイルを書き込む方法(出力)
プログラムを使ってCSVファイルを作成することを、専門用語で「書き出し(エクスポート)」と呼びます。PHPでデータをCSV形式として保存する流れは、実は「ノートに文字を書く手順」とそっくりです。
- ① fopen: ノート(ファイル)を開き、ペンを持つのと同じ。
- ② fputcsv: 1行ずつ文字を書き込む。このとき、PHPが自動で「カンマ区切り」にしてくれます。
- ③ fclose: 書き終わったらノート(ファイル)を閉じて、机に片付ける。
プログラミング未経験の方でも分かりやすいよう、会員名簿を作るシンプルなサンプルコードを見てみましょう。
// 1. 書き込みたいデータを「配列」の中に用意します
$data = [
["名前", "年齢", "メールアドレス"], // 1行目(見出し)
["山田太郎", "25", "taro@example.com"], // 2行目
["鈴木花子", "30", "hanako@example.com"], // 3行目
];
// 2. ファイルを「書き込み用(w)」として開きます
// "sample.csv" という名前のファイルが作られます
$fp = fopen("sample.csv", "w");
// 3. データの数だけ、繰り返し書き込み処理を行います
foreach ($data as $line) {
// fputcsv関数が、配列を自動的に「,」で区切って保存してくれます
fputcsv($fp, $line);
}
// 4. 最後に必ずファイルを閉じます
fclose($fp);
echo "CSVファイルの作成が完了しました!";
このプログラムを実行すると、同じフォルダ内に「sample.csv」というファイルが誕生します。fputcsvのすごいところは、データの中にカンマが含まれていても、適切にダブルクォーテーション(")で囲むなど、CSVのルールに則って安全に処理してくれる点です。手動で文字列を連結するよりも、圧倒的にミスが少なく、検索エンジン(SEO)にも好まれる正確なデータ構造を保つことができます。
3. PHPでCSVファイルを読み込む方法(入力)
作成したCSVファイルや、既存のデータを取り込んでプログラムで利用することを「読み込み(インポート)」と呼びます。PHPでCSVを読み込む際も、書き込み時と同じように「ファイルを開いて、中身を確認し、最後に閉じる」という3つのステップで進めていきます。
特に重要なのがfgetcsv関数です。この関数は、CSV特有の「カンマ区切り」を自動的に判別し、1行分のデータを扱いやすい「配列(データの詰め合わせセット)」に変換してくれる、初心者にとって非常に心強い味方です。
それでは、先ほど作成した「sample.csv」を読み込んで、画面に表示させる仕組みを作ってみましょう。プログラミングが初めての方でも、以下のコードの流れを追えば仕組みが理解できるはずです。
// 1. ファイルを「読み込み専用(r)」モードで開きます
// "r"はRead(読む)の頭文字です
$fp = fopen("sample.csv", "r");
// 2. while文を使って、ファイルの終点まで1行ずつ処理を繰り返します
// fgetcsvが1行読み込むたびに、$lineという変数に配列としてデータが入ります
while (($line = fgetcsv($fp)) !== false) {
// 3. 読み込んだ1行分のデータ(配列)の中身を画面に表示します
// print_rは配列の中身を確認するための便利な命令です
print_r($line);
}
// 4. 読み込みが終わったら、忘れずにファイルを閉じます
fclose($fp);
このプログラムを実行すると、ブラウザ上には以下のような形でデータが表示されます。これは、PHPがCSVの各項目を「0番目、1番目、2番目…」という番号(インデックス)が付いた箱に仕分けてくれた状態です。
Array
(
[0] => 名前
[1] => 年齢
[2] => メールアドレス
)
Array
(
[0] => 山田太郎
[1] => 25
[2] => taro@example.com
)
なぜwhile文を使うの?
CSVファイルには何行データが入っているか分かりません。10行かもしれないし、1000行かもしれません。whileを使うことで、「次の行がある限り、ずっと読み込みを続ける」という命令が出せるため、どんな長さのファイルでも確実に最後まで処理することができるのです。
4. CSVの文字コードに注意!Shift-JISとUTF-8の違い
日本語を含むCSVを扱う場合、「文字化け(もじばけ)」に注意が必要です。これは、文字コードが合っていないときに起きる現象です。
一般的に、WindowsのExcelは「Shift-JIS(シフト ジェイ アイ エス)」という文字コードを使っています。一方、PHPでは「UTF-8(ユーティーエフ エイト)」が主流です。
そのため、文字化けを防ぐには、mb_convert_encoding関数で文字コードを変換することが重要です。
$data = ["名前", "年齢", "メールアドレス"];
$converted = mb_convert_encoding($data, "SJIS-win", "UTF-8");
5. 文字列処理の基本(文字数カウント・一部抽出)
CSVの中の文字を操作するには、PHPの文字列処理が役立ちます。ここではよく使う処理をいくつか紹介します。
①文字数を数える: mb_strlen を使います。
$str = "こんにちは";
echo mb_strlen($str); // 5
②文字列の一部を取り出す: mb_substr を使います。
$str = "こんにちは世界";
echo mb_substr($str, 0, 5); // 「こんにちは」
③検索する文字列を探す: strpos は部分一致に使えます。
$email = "hanako@example.com";
if (strpos($email, "@") !== false) {
echo "メールアドレスです。";
}
6. 実践!CSVのデータを読み込んで条件で抽出しよう
最後に、CSVファイルの中から特定の条件に合うデータだけを取り出す例を見てみましょう。
$fp = fopen("sample.csv", "r");
while (($line = fgetcsv($fp)) !== false) {
if ($line[1] >= 30) {
echo $line[0] . "さんは30歳以上です。\n";
}
}
fclose($fp);
このコードでは、年齢が30歳以上の人だけを抽出して表示しています。実務でもよく使うテクニックなので、ぜひ覚えておきましょう。
まとめ
ここまでPHPでCSVファイルを扱うための基本的な操作を順番に確認してきましたが、改めて振り返ってみると、CSVという形式がとても柔軟で扱いやすい仕組みであることがよくわかります。特に、日常的にExcelでデータを表として管理している人にとっては、CSVがそのまま表形式として読み書きできるという点は大きな利点になります。PHPでは、専用の難しいライブラリを使わなくても、標準の関数で簡単にCSVに書き込んだり読み出したりできるので、初心者の段階からでも実務的な処理に挑戦していくことができます。 CSVへの書き出しでは、fopenでファイルを開いてfputcsvで配列を一行ごとに書き込むだけというわかりやすい手順で進められるため、最初に学ぶ外部ファイル操作としてとても適しています。書き出すデータも二次元配列として整理しておけば、「表の行」にあたる配列を一つずつfputcsvに渡すだけで整ったCSVファイルが完成するため、データ処理の基本構造も自然と理解できるようになります。また、読み込みについても、fgetcsvを使って一行ずつ配列として取得していく仕組みを理解しておくことで、取得したデータをどのように加工し、どのように表示するかという流れがつかみやすくなります。 さらに、CSVを扱ううえで避けて通れない問題として、「文字化け」というテーマがありますが、この記事の中でも触れたように、日本語を含むデータを扱う際には文字コードが大きく影響します。Windows環境でExcelを使う場合はShift-JISが前提となるケースが多く、PHPの内部処理ではUTF-8が中心となるため、そのまま文字列を書き出すと意図しない表示になることがあります。そのため、mb_convert_encodingを使って適切に文字コードを変換する習慣をつけておくことは実務でも非常に重要です。こういった細かな部分に気を配りながら処理を書くことで、実際の業務でも安心して使えるコードになります。 また、CSVに関連する処理ではPHPの文字列操作の基本も欠かせません。文字数を数えたり、一部の文字列だけを抜き出したり、特定の文字を探したりといった作業は、読み込んだデータを加工するうえで頻繁に登場します。特にmb_strlenやmb_substrのようにマルチバイト文字に対応した関数は、日本語のような複数バイトで表現される文字を扱う際に非常に役立ちます。処理の正確性にも関わる部分なので、習慣的にマルチバイト対応の関数を使うよう意識するだけで、後々のデータ処理の品質が大きく変わります。 CSVを読み込んだあとに条件に応じてデータを抽出する例では、単純な比較や検索を組み合わせるだけで実務に使える処理が簡単に作れることを実感できたと思います。fgetcsvで取得した配列の各要素を確認し、必要な条件に当てはまる場合だけ特定のメッセージを表示したり別の処理を行ったりするように書くことで、名簿管理、商品管理、顧客データの整理などさまざまな用途に応用できます。こうした処理は日常の開発でもよく登場するため、今回学んだ仕組みを手元で何度か試してみるだけで、実践的なスクリプトを書きこなせるようになります。 PHPのCSV操作はシンプルでありながら奥行きが深く、基本的な構文や関数を理解することでデータ管理の幅が一気に広がります。最初はファイル操作そのものに不安を感じることもあるかもしれませんが、実際にコードを動かしてみると意外とシンプルであることがわかり、徐々に自分でデータを扱う楽しさも見えてきます。今後は今回の内容を土台に、読み込んだデータの加工や、複数のファイルを扱う処理、大量データへの対応などに挑戦することで、より高度なデータ処理へ進むことができるでしょう。
サンプル:CSVを読み込み、名前を整形して出力する処理
今回学んだ内容を組み合わせて、CSVから名前を読み込み、敬称をつけて整形して表示する例を紹介します。
<?php
$fp = fopen("sample.csv", "r");
while (($line = fgetcsv($fp)) !== false) {
if ($line[0] !== "名前") {
$name = mb_convert_encoding($line[0], "UTF-8", "SJIS-win");
echo "<p class='user'>" . $name . "さんのデータを読み込みました。</p>";
}
}
fclose($fp);
?>
このサンプルでは、CSVの「名前」という列を読み込み、必要に応じて文字コードを整えてからHTMLとして出力しています。シンプルな処理ではありますが、文字列の加工・CSVの読み込み・HTML形式への変換など、多くの基本が詰まっています。学んだ内容を実際のコードの中でどう活かせるかを確認するうえでも最適な例です。
生徒
「CSVって単純なファイルだと思っていましたが、PHPで扱ってみると意外と便利で、いろんな処理に応用できるんですね。」
先生
「そうなんですよ。表形式のデータを扱う場面ではCSVは特に役立ちますし、PHPの標準関数だけで十分に操作できるのが魅力です。」
生徒
「文字コードの違いがあると表示が崩れたりする理由もようやく理解できました。mb_convert_encodingって大事なんですね。」
先生
「文字化けは日本語を扱ううえでは避けられないテーマなので、そこでつまずかないように理解しておくと実務でも役立ちますよ。」
生徒
「今回学んだ読み込みや条件抽出の例も、実際に使える場面がすぐ浮かんできました。自分でもいろいろ試してみたいです!」
先生
「ぜひ挑戦してみてください。CSVを扱えるだけで、データを使ったアプリケーションの可能性がぐっと広がりますよ。」