10

を使用して、クライアントがダウンロードする CSV ファイルを作成します

$output = fopen('php://output', 'w');

fputcsv()クライアントによってダウンロードされた CSV ファイルにデータを書き込むために使用します。

Linux で PHP を実行しているため、多くの Windows アプリケーションで行末が解釈されません。

CSV ファイルをサーバー上のディレクトリに書き込み、それを読み込んでstr_replace()から\ntoを実行することもできます\r\nが、これは問題を解決する方法としてはかなり扱いにくいようです。物理ファイルを作成せずに変換を実行する方法はありますか?

4

5 に答える 5

23

これを実現するためにストリームフィルターを使用できます。この例は物理ファイルに書き込みますが、php://output同様に正常に機能するはずです。

// filter class that applies CRLF line endings
class crlf_filter extends php_user_filter
{
    function filter($in, $out, &$consumed, $closing)
    {
        while ($bucket = stream_bucket_make_writeable($in)) {
            // make sure the line endings aren't already CRLF
            $bucket->data = preg_replace("/(?<!\r)\n/", "\r\n", $bucket->data);
            $consumed += $bucket->datalen;
            stream_bucket_append($out, $bucket);
        }
        return PSFS_PASS_ON;
    }
}
// register the filter
stream_filter_register('crlf', 'crlf_filter');

$f = fopen('test.csv', 'wt');
// attach filter to output file
stream_filter_append($f, 'crlf');
// start writing
fputcsv($f, array('1 1', '2 2'));
fclose($f);
于 2012-10-04T08:52:40.800 に答える
2

PHP自体でこれを行うことができるかどうかはわかりません。ファイル書き込み用に PHP の EOL を変更する方法があるかもしれませんが、おそらくシステムに依存します。ping できる Windows システムがありませんね。;)

実際の解決策としては、str_replace行単位ではなく、Linux プログラムがインストールされていると仮定してunix2dos(の逆) Linux プログラムを使用できます。dos2unix

fputcsv($fh ...)
exec("unix2dos " . escapeshellarg($filename));
于 2012-10-04T08:41:03.310 に答える
-1

Macintosh コンピューター上または Macintosh コンピューターで作成されたファイルを読み取るときに、PHP が行末を正しく認識しない場合は、auto_detect_line_endings ランタイム構成オプションを有効にすると、問題の解決に役立つ場合があります。ini_set("auto_detect_line_endings", true);

于 2019-03-26T12:53:53.903 に答える