ファイルから行を取り出し CSV フィールドとして処理する

# SplFileObject::fgetcsv

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

SplFileObject::fgetcsv — ファイルから行を取り出し CSV フィールドとして処理する

### 説明

public function SplFileObject::fgetcsv(string `$separator` = ",", string `$enclosure` = "\"", string `$escape` = "\\"): array|false

CSV フォーマットのファイルから行を取り出し読み込まれたフィールドを含む配列を返します。

> 注意: この関数はロケール設定を考慮します。 例えば、`LC_CTYPE` が `en_US.UTF-8` の場合、 1 バイトエンコーディングでエンコードされたデータが 間違って処理されるかもしれません。

### パラメータ

`separator`

  フィールドの区切り文字 (シングルバイト文字 1 文字のみ)。 デフォルトはカンマ(`,`)、 もしくは事前に SplFileObject::setCsvControl() を呼び出してセットされた値です。

`enclosure`

  フィールド囲み文字 (シングルバイト文字 1 文字のみ)。 デフォルトはダブルクォート(`"`)、もしくは事前に SplFileObject::setCsvControl() を呼び出してセットされた値です。

`escape`

  エスケープ文字 (シングルバイト文字 最大で1文字)。 デフォルトはバックスラッシュ(`\`)、 もしくは事前に SplFileObject::setCsvControl() を呼び出してセットされた値です。 空文字列(`""`)の場合、(RFC 4180 に準拠していない) 独自仕様のエスケープ機構が無効になります。

  警告

  入力ストリームにおいて、`enclosure` 文字は クォートされた文字列の中で2回連続させることで常にエスケープでき、 パース結果では単一の `enclosure` 文字になります。 `escape` 文字の動作は異なります: 入力中に `escape` と `enclosure` 文字の並びが出現した場合、 パース結果には両方の文字がそのまま残ります。 よって、デフォルトのパラメータの場合、 `"a""b","c\"d"` のような CSV の行は それぞれ `a"b` と `c\"d` にパースされます。

  警告

  PHP 8.4.0 以降では、`escape` のデフォルト値に依存することは非推奨となりました。 位置指定の引数か、名前付き引数を使用するか、 あるいは SplFileObject::setCsvControl() を呼び出して、明示的に指定する必要があります。

警告

`escape` が空の文字列(`""`)以外に設定されているとき、 » RFC 4180 に準拠しない CSV が生成されたり、PHP の CSV 関数を介してラウンドトリップ(往復変換)でデータが壊れる可能性があります。 `escape`のデフォルト値は`"\\"` なので、明示的に空の文字列を指定することを推奨します。デフォルト値は、PHP 9.0 以降の将来のバージョンで変更予定です。

### 戻り値

読み込まれたフィールドを含む数値添字配列もしくはエラーのときは `false` を返します。

> 注意:

> CSV ファイルの空白行は `SplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE` を使わない限り単独の `null` フィールドで構成される配列として返され、この場合空白行は読み飛ばされます。

### エラー / 例外

`separator` または `enclosure` が 1 バイト長ではない場合、ValueError をスローします。

`escape` が 1 バイト長、または空文字列ではない場合、 ValueError をスローします。

### 変更履歴

バージョン | 説明
--- | ---
8.4.0 | `escape` のデフォルト値に依存することは、 非推奨になりました。
7.4.0 | `escape` パラメータは空文字列を受け入れるようになりました。 この場合、(RFC 4180 に準拠していない) 独自仕様のエスケープ機構が無効になります。

### 例

例1 SplFileObject::fgetcsv() の例

    <?php
    $file = new SplFileObject("data.csv");
    while (!$file->eof()) {
        var_dump($file->fgetcsv());
    }
    ?>

例2 `SplFileObject::READ_CSV` の例

    <?php
    $file = new SplFileObject("animals.csv");
    $file->setFlags(SplFileObject::READ_CSV);
    foreach ($file as $row) {
        list($animal, $class, $legs) = $row;
        printf("A %s is a %s with %d legs\n", $animal, $class, $legs);
    }
    ?>

animals.csv の内容

    crocodile,reptile,4
    dolphin,mammal,0
    duck,bird,2
    koala,mammal,4
    salmon,fish,0

上の例の出力は、 たとえば以下のようになります。

    A crocodile is a reptile with 4 legs
    A dolphin is a mammal with 0 legs
    A duck is a bird with 2 legs
    A koala is a mammal with 4 legs
    A salmon is a fish with 0 legs

### 参考

- SplFileObject::fputcsv() - フィールドの配列を CSV の行として書き出す
- SplFileObject::setCsvControl() - CSV の区切り文字、囲み文字、エスケープ文字をセットする
- SplFileObject::getCsvControl() - CSV の区切り、囲み文字、エスケープ文字を取得する
- SplFileObject::setFlags() - SplFileObject のフラグをセットする
- `SplFileObject::READ_CSV`
- SplFileObject::current() - ファイルの現在の行を取得する
- fputcsv() - 行を CSV 形式にフォーマットし、ファイルポインタに書き込む
- fgetcsv() - ファイルポインタから行を取得し、CSVフィールドを処理する
- str_getcsv() - CSV 文字列をパースして配列に格納する

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open