エンクロージャーなしで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),',',' ');
NULL
の値はほとんどのcsvパーサーを停止させる可能性が高いため、car(0)
はうまくいきませんでした。
fputcsv()
の使用を終了して初期ファイルを作成し、すべての引用符を削除して削除しました。エレガント?たぶんそうではありませんが、仕事は完了しました:)。
二重引用符を削除するにはトリッキーな方法を使用しますが、Linuxのみです
....
fputcsv($fp, $product_data,"\t");
....
Shell_exec('sed -i \'s/"//g\' /path/to/your-file.txt ');
<?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',
);
古き良き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のデータをエスケープする必要があります)
chr(0)
も私のために働いた:
fputcsv($fp, $aLine, $sDelimiter, chr(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));
?>
これは、標準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ループで必要なものを出力できます。