Developer

【PHP基礎】ファイルシステム関数③ fgetcsv, fputcsv
2021.03.01
Lv1

【PHP基礎】ファイルシステム関数③ fgetcsv, fputcsv

ファイルシステム関数③

前回に引き続き、ファイルの読み書きの際に必要なファイルシステム関数を紹介します。

■csvファイルの読み込み・書き込み

前々回の記事でも説明したとおり、
ファイル操作での基本的な流れは以下のようになります。

  1. ファイルを開く
  2. ファイルを読み込む・書き込む
  3. ファイルを閉じる

今回はこの基本手順の②の中でも、 特定の文字で区切られたテキストファイルに対しての
「ファイルの読み込み」「ファイルへの書き込み」操作で必要な関数を紹介します。
特定の文字で区切られたファイルの例としては以下のようなものが挙げられます。

  • CSV (Comma Separated Value)
  • TSV (Tab Separated Value)

例)CSVファイル(データを「,」区切りでまとめたファイル)


■fgetcsv関数


https://www.php.net/manual/ja/function.fgetcsv.php

fgetcsv関数は、CSVファイルを1行ずつ読み込みます。

構文

fgetcsv( handle [, length [, delimiter [, enclosure [, escape ] ] ] ] )

引数

handle fopen()またはfsockopen() で正常にオープンされたファイルやURL
length 読み込む最大長(バイト単位)
delimiter 区切り文字。デフォルトは「カンマ( , )」
enclosure 囲い込み文字。デフォルトは「ダブルクォーテーション( “ )」
escape エスケープ文字。デフォルトは「\\」

戻り値

データ型 array
値の説明 CSVファイルから1行を読み込み、区切り文字で分割した結果を配列で返します。
ファイルの終端に達すると、FALSEを返します。

サンプル

以下の「sample.csv」を読み込んで、
データがわかりやすいよう加工してブラウザに表示 参考)sample.csv


<?php
// ファイルを開く(読み取りモード)
$file = fopen("sample.csv", "r");

// CSVファイルの中身を1行ずつ読み取る
while ($data = fgetcsv($file)) {
    echo " No.".$data[0];
    echo " 名前:".$data[1];
    echo " 年齢:".$data[2];
    echo " 住所:".$data[3];
    echo "<hr>";
}
	
// ファイルを閉じる
fclose($file);
?>

結果



■fputcsv関数


https://www.php.net/manual/ja/function.fputcsv.php

fputcsv関数は、配列をCSVとしてフォーマットし、ファイルに書き込みます。

構文

fgetcsv( handle, fields [, delimiter [, enclosure [, escape_char ] ] ] ] )

引数

handle fopen()またはfsockopen() で正常にオープンされたファイルやURL​
fields 配列
delimiter 区切り文字。デフォルトは「カンマ( , )」
enclosure 囲い込み文字。デフォルトは「ダブルクォーテーション( “ )」
escape_char エスケープ文字。デフォルトは「\\」

戻り値

データ型 int
値の説明 書き込んだ文字列の長さを返します。失敗した場合に FALSE を返します。

サンプル

csvとして書き出したいデータの配列を作成し、
「export.csv」に一次元配列を1行として繰り返し書き出す

<?php
// ファイルを開く(書き込みモード)
$file = fopen("export.csv", "w");

// 元の配列(2次元)
$arr = [
    [1, "りんご", 100],
    [2, "バナナ", 150],
    [3, "みかん", 200]
];

// 配列を1つずつファイルに書き込む
foreach ($arr as $data) {
    fputcsv($file, $data);
}

// ファイルを閉じる
fclose($file);
?>

結果



まとめ

今回紹介したfgetcsv, fputcsv は引数も多く複雑そうに見えますが、前回紹介した
fget, fwrite の区切り文字がある場合にも使用できるかどうかの違いだけです。
考え方としてはmysqli関数でDBのテーブルを読み込んでくるときと
同じような考え方ですので、きちんと理解しておきましょう。
ファイルシステム関数の紹介は以上となります。

PHP基礎 連載目次リンク

PHP基礎 連載目次