PHPでエンクロージャなしでファイルにCSVを書き込む
質問
エンクロージャーなしでCSVファイルに配列を行として書き込むためのネイティブ関数またはソリッドクラス/ライブラリはありますか?エンクロージャパラメータに何も渡されない場合、 fputcsv
はデフォルトで"
になります。 Googleは私を失敗させています( fputcsv
に関するページ全体の結果を返します)。PEARのライブラリは fputcsv
とほぼ同じことを行います。
fputcsv
とまったく同じように機能するが、フィールドを引用符で囲まないでおくことができるもの。
現在:" field 1"、" field 2"、field3hasNoSpaces
望ましい: field 1、field 2、field3hasNoSpaces
解決
前述のエンクロージャーに関する警告は有効ですが、ユースケースには適用されないと述べています。
なぜこのようなものを使用できないのか疑問に思っていますか
<?php
$fields = array(
"field 1","field 2","field3hasNoSpaces"
);
fputs(STDOUT, implode($fields, ',')."\n");
他のヒント
chr()関数で動作します:
fputcsv($f,$array,',',chr(0));
fputcsv($ file、$ data、 ';'、chr(127));
これは機能しませんか?
fputcsv($fp, split(',', $line),',',' ');
まあ car(0)
は NULL
の値がほとんどのcsvパーサーを詰まらせる可能性が高いためうまくいかなかった。
fputcsv()
を使用して初期ファイルを作成し、すべての引用符を削除して削除しました。エレガント?たぶんそうではありませんが、仕事は完了しました:)。
<?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',
);
二重引用符を削除するにはトリッキーな方法を使用しますが、Linuxのみです
....
fputcsv($fp, $product_data,"\t");
....
shell_exec('sed -i \'s/"//g\' /path/to/your-file.txt ');
これは、標準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ループで必要なものを出力できます。
エンクロージャーのないCSVファイルの欠点は、ユーザー入力の誤ったコンマが行を混乱させることを意味します。したがって、CSV行を書き込む前にコンマを削除する必要があります。
CSVを処理する際の扱いにくい部分は、エンクロージャーの解析です。これにより、PHPが&amp; 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));
?>
chr(0)
も私のために働いた:
fputcsv($fp, $aLine, $sDelimiter, chr(0));
それを理解しました。 Nullのasciiコードを car()
関数に渡すことで、問題なく動作するようです。
fputcsv($ f、$ array、$ delimiter、car(0))
皆さんの回答に感謝します!!!