10


1

PHPのfputcsv()によって生成されたCSV値を「」でラップします

したがって、私のコードは、PHPの組み込みhttp://us3.php.net/manual/en/function.fputcsv.php [fputcsv]関数を使用してCSVファイルを生成します。

区切り文字には、「」、「コンマ」を使用します。 +エンクロージャーには、 '' "'`(二重引用符)を使用します。

ただし、次のようなことをしようとすると

fputcsv($file,array('a','b',"long string, with commas",NULL,''),',','"');

出力する

a,b,"long string, with commas",,

でも出力したい

"a","b","long string, with commas","",""

これに対処する簡単な方法はありますか、それとも「fputcsv」の代わりを作成する必要がありますか?

5 Answer


9


通常、これはCSVファイルの問題ではありません。

fputcsvは、値があいまいになる場合、値を引用符で囲みます。 例えば、

a,b,"long string, with commas",,

曖昧ではありませんが、

a,b,long string, with commas,,

は、ほとんどの場合(読み取り:すべて)、CSVリーダーによって5つ以上のフィールドがあると解釈されます。

CSVパーサーは、引用符がなくても文字列リテラルを受け入れます。

とにかく値を引用符で囲む必要がある場合は、次のスニペットでそれを行います。 文字列内の引用符をエスケープしません-その練習は読者に任されています:

$row = '"' . implode('", "', $rowitems) . '"';

これをすべての行のループに入れたいと思うでしょう。


8


この問題を回避するために、スペース付きの偽の文字列文字を挿入し、#@ @#を削除しました。 サンプルの実装は次のとおりです。

//$exported is our array of data to export
$filename = 'myfile.csv';
$fp = fopen($filename, 'w');
foreach ($exported as $line => $row) {
    if ($line > 0) {
        foreach ($row as $key => $value) {
                $row[$key] = $value."#@ @#";
        }
    }
    fputcsv($fp, $row);
}

fclose($fp);
$contents = file_get_contents($filename);
$contents = str_replace("#@ @#", "", $contents);
file_put_contents($filename, $contents);

これは、空のフィールドを含むすべてのフィールドを二重引用符で囲みます


2


解決策はこのようになると思います

$order_header_arr = array("Item1", "Item2","This is Item3");
fputcsv($fp, $order_header_arr,',',' ');

`" "`を覚えてください[スペース] fputcsvの3番目のパラメータ間


0


str_replace( ',,'、 '、 ""、'、$ output);できない理由? また、最後または最初の文字がコンマかどうかを確認する必要があります。コンマを使用している場合は、コンマを ""に置き換えます


0


fputcsvは、すべての配列変数を引用符で囲みません。 引用符なしの数値配列値は正しい場合がありますが、ラベルまたは住所プログラムが数値の定義された米国郵便番号に遭遇すると、印刷時に先行ゼロが削除されるため問題が発生します。 したがって、05123-0019は5123-19になります。

存在するかどうかにかかわらず、すべての値を引用符で囲むには、fgetsrcで入力ファイルを読み取り、fwriteを使用して修正バージョンを書き込みます。 fgetsrcは、レコードを配列変数に読み取ります。 fwriteは変数を書き込むため、配列変数を文字列で囲み、引用符で囲み、配列変数をコンマで区切る必要があります。 次に、レコード区切り文字を追加します。