2012-10-04 5 views
7

は私がfputcsvで使用されている行末をどのように変更できますか?

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

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

私はLinux上でPHPを実行しています。その結果、行末は多くのWindowsアプリケーションで解釈されません。

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

+0

を使用することですCRLFを必要とするWindowsのテキストエディタ、またはかなり古いWindowsアプリケーションがあれば、実際には問題にならないはずです...最近のほとんどのWindowsアプリケーションでは、単純なLFが認識されます –

+1

+1のために申し訳ありませんが、 。しかし、あなたの質問は私にも関係しています。エスケープ文字を変更する方法はありません。 –

+0

@MarkBaker:はい、それは私が期待したものです。残念ながら、彼らは使用しているいくつかのMISにCSVをインポートしていますが、これはメモ帳よりもスマートではありません。 – Kalessin

答えて

17

あなたはストリームを使用することができます;)真の解決策については

、代わりのstr_replaceライン・バイ・ライン、あなたはそれがインストールされていると仮定すると、Linuxのプログラムunix2dosdos2unixの(逆)を使用することができますこれを達成するためのフィルタ。この例では物理ファイルに書き込みますが、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); 
2

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

fputcsv($fh ...) 
exec("unix2dos " . escapeshellarg($filename)); 
1
  1. プレストねえFTP
  2. Linuxマシン上のWindowsマシン
  3. にLinuxマシンからASCIIとしてファイルを\ n個の行末を持つファイルを作成します!すべての行末は現在、\ rを\しているn個のWindowsマシン
-1

ではなくファイルの書き込み上のファイルに、より良い解決策は、ユーザーがファイルを開いている場合を除き、出力バッファリング

function output($buffer) { 
    return str_replace("\r", "\r\n", $buffer); 
} 

ob_start('output'); 
fputcsv(....); 
関連する問題