web-dev-qa-db-ja.com

エンクロージャなしのファイルにCSVを書き込むPHP

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

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

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

希望:field 1,field 2,field3hasNoSpaces

48
Derek Reynolds

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

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

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

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

fputcsv($f,$array,',',chr(0));
13

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

4
Raul Duran

これは機能しませんか?

fputcsv($fp, split(',', $line),',',' ');
2
Arthur Frankel

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

fputcsv()の使用を終了して初期ファイルを作成し、すべての引用符を削除して削除しました。エレガント?たぶんそうではありませんが、仕事は完了しました:)。

2
Derek Reynolds

二重引用符を削除するにはトリッキーな方法を使用しますが、Linuxのみです

....
fputcsv($fp, $product_data,"\t");
....
Shell_exec('sed -i \'s/"//g\' /path/to/your-file.txt ');
1
Ansyori
<?php       

$filename = "sample.csv";
$handle = fopen($filename, 'w+');
fputcsv($handle, ['column 1','column 2']);
$data = ['sample','data'];

fputs($handle, implode($data,',')."\n");

// or

fwrite($handle, implode($data,',')."\n");

fclose($handle);
$headers = array(
    'Content-Type' => 'text/csv',
);
1
zeros-and-ones

古き良きfwrite()の何が問題になっていますか?

function encloseString($field){
    return ($field) ? '"' . $field . '"' : null;
}

$delimiter = ';';
$data = ["data_field_1", "data_field_2", "data_field_3"];

$fp = fopen("some-file.csv", 'w');

for($i = 0;$i<100000;$i++) {
    fwrite($fp, implode($delimiter, array_map('encloseString', $data) . "\n");
}

fclose($fp);

(明らかに、最初に$ dataのデータをエスケープする必要があります)

0
Matthew Fedak

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

 fputcsv($fp, $aLine, $sDelimiter, chr(0));
0
jb7AN

エンクロージャーのない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));

?>
0
leepowers

これは、標準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ループで必要なものを出力できます。

0
jjclarkson