57

エンクロージャなしで CSV ファイルに配列を行として書き込むためのネイティブ関数またはソリッド クラス/ライブラリはありますか? エンクロージャ パラメータに何も渡されない場合fputcsvは、デフォルトで になります。"Google は私に失敗していますfputcsv( fputcsv.

とまったく同じようfputcsvに機能しますが、フィールドを引用符で囲まないままにすることができます。

現在:"field 1","field 2",field3hasNoSpaces

希望:field 1,field 2,field3hasNoSpaces

4

13 に答える 13

68

前述のエンクロージャーに関する警告は有効ですが、ユースケースには適用されないとおっしゃいました。

なぜこのようなものだけを使用できないのだろうか?

<?php
$fields = array(
    "field 1","field 2","field3hasNoSpaces"
);
fputs(STDOUT, implode(',', $fields)."\n");
于 2009-12-15T03:07:18.547 に答える
13

chr()関数で動作します:

fputcsv($f,$array,',',chr(0));
于 2012-11-14T10:16:35.473 に答える
6

fputcsv($file, $data, ';', chr(127));

于 2017-03-31T09:04:33.383 に答える
2

値がほとんどのcsvパーサーを窒息させる可能性が高いため、うまくいきcar(0)ませんでした。NULL

fputcsv()最初のファイルを作成するために使用を終了し、すべての引用符を調べて削除しました。エレガント?そうではないかもしれませんが、仕事は完了しました:)。

于 2009-12-05T01:19:33.397 に答える
1

これは機能しませんか?

fputcsv($fp, split(',', $line),',',' ');
于 2009-11-25T23:41:18.473 に答える
0

エンクロージャーのないCSVファイルの欠点は、ユーザー入力の誤ったコンマが行を混乱させることを意味します。したがって、CSV行を書き込む前にカンマを削除する必要があります。

CSVの処理で注意が必要なのは、エンクロージャーの解析です。これにより、PHPとPEARのCSV関数が価値のあるものになります。基本的に、列はコンマで区切られ、行は改行で区切られたファイルを探しています。簡単な出発点は次のとおりです。

<?php
$col_separator= ',';
$row_separator= "\n";

$a= array(
 array('my', 'values', 'are', 'awes,breakit,ome'),
 array('these', 'values', 'also', "rock\nAND\nROLL")
);

function encodeRow(array $a) {
 global $col_separator;
 global $row_separator;
 // Can't have the separators in the column data!
 $a2= array();
 foreach ($a as $v) {
  $a2[]= str_replace(array($col_separator, $row_separator), '', $v);
 }
 return implode($col_separator, $a2);
}

$output= array();
foreach ($a as $row) {
 $output[]= encodeRow($row);
}

echo(implode($row_separator, $output));

?>
于 2009-11-26T00:21:22.213 に答える
0

これは、標準のCSVを配列に入れるために使用するものです...

function csv_explode($delim=',', $str, $enclose='"', $preserve=false){
        $resArr = array();
        $n = 0;
        $expEncArr = explode($enclose, $str);
        foreach($expEncArr as $EncItem){
                if($n++%2){
                        array_push($resArr, array_pop($resArr) . ($preserve?$enclose:'') . $EncItem.($preserve?$enclose:''));
                }else{
                        $expDelArr = explode($delim, $EncItem);
                        array_push($resArr, array_pop($resArr) . array_shift($expDelArr));
                        $resArr = array_merge($resArr, $expDelArr);
                }
        }
        return $resArr;
} 

その後、foreach ループで必要なものを出力できます。

于 2009-11-25T23:37:54.847 に答える
0

ソリューションの選択は、アプリケーションによって異なります。場合によっては、csv 用の独自のコードが必要になります。ケース 1 (結果chr0を参照)、ケース 2 ( chr127 )、およびケース 3 ( chr127 ) では、データが変更されます (悪いこと)。代わりに、@oops に感謝します。

<?php
$fields = array(
    "field 1","field 2","field3hasNoSpaces"
);
fputs(STDOUT, implode(',', $fields)."\n");


case 1. `fputcsv($f, $array, $delimiter, car(0))`
See result [chr0][1]
case 2. `fputcsv($f, $array, $delimiter, car(127))`
[chr127][2]
case 3. `fputcsv($f, $array, $delimiter, ' ')`
[onespace][3]
case 4. Own code:
[oops](https://stackoverflow.com/a/1904945)
 or [Ansyori](https://stackoverflow.com/a/51981613)
 or [zeros-and-ones](https://stackoverflow.com/a/38778459)
produces better results.
于 2020-11-17T13:41:51.807 に答える
-1

chr(0)私のためにも働いた:

 fputcsv($fp, $aLine, $sDelimiter, chr(0));
于 2015-12-11T13:32:32.367 に答える
-3

理解した。Null の ASCII コードをcar()関数に渡すと、問題なく動作するようです。

fputcsv($f, $array, $delimiter, car(0))

みんな答えてくれてありがとう!!!

于 2009-11-26T00:40:52.397 に答える