PHP で CSVファイルを読み込むには?

ショコラ
ショコラ

PHP で CSVファイルを読み込むには?

fgetcsv関数を使うのかもしれませんが、そういえば昔そんな処理を作ったかな・・・と。
エクセルでCSV出力したものを読み込む処理です。

もっさん先輩
もっさん先輩

こちらのリンクを右クリックしてファイルをダウンロードできます。

https://answorz.com/4705/csv.php

csv.php の説明

ポイントは ダブルクォートで囲った値の改行に対応 しているところです。

<?php
function csv(string $file, array $keys = [], string $separator = ',')
{
  if (false === ($fp = fopen($file,'r')))
    return false;

  $row = [];
  $val = '';
  $in_quotes = false; //クォート内フラグ
  $last = ''; //最後の文字
  while (false !== ($buf = fgets($fp))) {
    $str = str_replace("\r",'',$buf);
    $len = mb_strlen($str);
    for ($p=0; $p <= $len; $p++) {
      $char = mb_substr($str,$p,1);
      if (($p == $len)  && !$in_quotes) {
        $row[] = rtrim($val,"\n");
        $val = '';
        if ([] !== $keys) {
          $row = array_combine($keys,array_pad($row,count($keys),null));
        }
        yield $row;
        $row = [];
      }
      else if (($separator == $char) && !$in_quotes) {
        $row[] = $val;
        $val = '';
      }
      else if ('"' == $char) {
        $in_quotes = !$in_quotes;
        // 2つのダブルクォートを1つにする処理
        if (('"' == $last) && ('"' == $char)) {
          $val .= $char;
          $char = '';
        }
      }
      else {
        $val .= $char;
      }
      $last = $char;
    }
  }
  fclose($fp);
  return true;
}

使い方

foreach (csv('test.csv') as $csv) {
  var_dump($csv);
}

以上

Scroll to Top