概要

CSV (Comma-Separated Values) は「カンマで区切ったテキスト形式」のシンプルな表形式データ。エクセルや分析ツールなどデータ交換のデファクト。だが「カンマで explode すれば OK」と自前実装すると、値にカンマが含まれる ("山田, 太郎") ケースや、ダブルクォートで囲まれた値で必ず破綻する。エスケープ仕様が地味に複雑、というのが落とし穴。

そこで PHP の fgetcsv() / fputcsv() を使う。ダブルクォート囲み・カンマエスケープを きちんと処理 してくれる正解関数。fgetcsv($fp) は 1 行読んで 数値添字の配列 ([0] => id, [1] => name, ...) を返す。連想配列ではないので、列の順番を頭で覚えておく必要がある。書き込みは fputcsv($fp, ['1', '太郎', '20']) のように配列を渡すだけ。

PHP 8.4 以降fgetcsv / fputcsv$escape 引数の挙動が変わり、明示的に '' を指定しないと deprecation 警告 が出る。歴史的なバックスラッシュ・エスケープが標準 CSV 仕様と違っていた混乱を正す変更で、現代の PHP では fgetcsv($fp, 0, ',', '"', '')第 5 引数を空文字で明示 するのが推奨形。本コースの解答例もこの形。

学習目標

ドリル

# 内容
01-read-csv/ tests/data/users.csv を読んで "id: name (age歳)" 形式で出力
02-write-csv/ 配列を fputcsv で 一時 CSV に書き、読み返して fgetcsv で出力

確認のコツ

演習: ドリル 01 — CSV を読んで整形出力

問題

__DIR__ . '/tests/data/users.csv' を読み、各データ行を "id: name (age歳)" の形式で出力してください。

データファイル (tests/data/users.csv):

id,name,age
1,太郎,20
2,花子,25
3,次郎,30

期待される出力:

1: 太郎 (20歳)
2: 花子 (25歳)
3: 次郎 (30歳)

(1 行目のヘッダ id,name,age は出力に含めない)

ヒント

$fp = fopen(__DIR__ . '/tests/data/users.csv', 'r');
$header = fgetcsv($fp, 0, ',', '"', '');   // 1 行目を読み捨てる
while (($row = fgetcsv($fp, 0, ',', '"', '')) !== false) {
    [$id, $name, $age] = $row;
    echo "{$id}: {$name} ({$age}歳)\n";
}
fclose($fp);

つまづいたら

演習: ドリル 02 — 配列を CSV に書いて読み返す

問題

次の配列を 一時 CSV ファイル に書き出し、その CSV を 読み返して 各行を " | " で結合して 1 行ずつ出力してください。最後に一時ファイルを unlink で消します。

書き出す配列:

$rows = [
    ['id', 'name', 'score'],
    [1, '太郎', 80],
    [2, '花子', 95],
    [3, '次郎', 60],
];

期待される出力 (書き出した CSV を読み返した結果):

id | name | score
1 | 太郎 | 80
2 | 花子 | 95
3 | 次郎 | 60

ヒント

$tmp = tempnam(sys_get_temp_dir(), 'dojo_csv_');

// 書く
$fp = fopen($tmp, 'w');
foreach ($rows as $row) {
    fputcsv($fp, $row, ',', '"', '');
}
fclose($fp);

// 読み返す
$fp = fopen($tmp, 'r');
while (($row = fgetcsv($fp, 0, ',', '"', '')) !== false) {
    echo implode(' | ', $row) . "\n";
}
fclose($fp);

unlink($tmp);

つまづいたら

この章を AI に聞く

  1. 「ch04 — CSV を読み書きする」のつまずきやすいポイントを、初学者向けに3つ教えてください

    💬 ChatGPT 📘 Claude ✨ Gemini

  2. 「ch04 — CSV を読み書きする」について、自分の手で試せる練習問題を3つ出してください (難易度を上げながら)

    💬 ChatGPT 📘 Claude ✨ Gemini

  3. 「ch04 — CSV を読み書きする」を学んだ後、次に学ぶと良いトピックは何ですか?理由も教えてください

    💬 ChatGPT 📘 Claude ✨ Gemini

🎉 受講お疲れさまでした!

ch04 — CSV を読み書きする」を読み終えました。
学んだことを誰かに教えると、もっと記憶に残ります。

X で共有 Hatena LINE