PHP

PHP - MacのExcelで変換したCSVをfgetcsvで読み込もうとすると改行されなくて一行になってしまう問題

あれ?以前PHPで作成したCSVアップロードがなんか動かない。なぜだろうとデバックしてみると、fgetcsvでの読込結果が一行になってしまってました。調べてみるとMacのExcelで変換したCSVが原因だと判明しました。この問題の解決方法のメモです。

あれ?PHPで書いたCSVアップロードがおかしい

以前PHPで書いたCSVアップロード機能がいきなりおかしくなってしまいました。

なぜだろうとデバックしてみると、fgetcsvでの読込結果が一行になっておりまして。

なんじゃこりゃああああああああ

今まで動いていたのに、なんでなんだろうと、ちょっと考えてみると。。

あーもしやMacのExcelからCSVに変換したのが原因かも?

調べてみると、ジャスト!

Macで作成したCSVは行末が読み込めず、全部の内容を一行で読み取ってしまうというカオス状態になってしまうとのこと。

さあ、原因がつかめたので、修正作業をしていきまっしょ。

Macで作成したCSVにもロバストなアップロード機能をPHPで実装

マックで作成したCSVだと上手くfgetcsvできないけど改行にさえ気をつければ関係ないよねっ | 日記の間 | あかつきのお宿

を参考に、修正しました。

fopenでファイルを開いてfgetcsvを使うとカオスになってしまうので、ひとつ前にfile_get_contents関数をはさんで問題となっている改行コードを置換する方法で修正しましたー。

フォーム部分はみなさんのご想像におまかせして省略します。

以下、フォーム先の関数です。

$rows = array();
if (is_uploaded_file($_FILES["csv"]["tmp_name"]))
{
    $file_tmp_name = $_FILES["csv"]["tmp_name"];
    $file_name = $_FILES["csv"]["name"];

    //拡張子を判定
    if (pathinfo($file_name, PATHINFO_EXTENSION) != 'csv')
    {
        $err_msg = 'CSVファイルのみ対応しています。';
    }
    else
    {
        // MacのExcelで変換したCSVにも対応するため一旦置換
        $buf = file_get_contents($file_tmp_name);
        $buf = preg_replace("\r\n|\r|\n","\n", $buf);
        $fp = tmpfile();
        fwrite($fp, $buf);
        rewind($fp);

        //配列に変換する
        while (($data = fgetcsv($fp, 0, ",")) !== FALSE)
        {
            $rows[] = $data;
        }
        fclose($fp);
    }
}
else
{
    $err_msg = "ファイルが選択されていません。";
}

$header = array_shift($rows);
var_dump($header);
var_dump($rows);
exit();

こんな感じで書いたらちゃんと動くはずです!

-PHP