Schreiben Sie CSV-Datei ohne Gehäuse in PHP
Frage
Gibt es eine native Funktion oder feste Klasse / Bibliothek für das Schreiben ein Array als eine Zeile in einer CSV-Datei ohne Gehäuse? fputcsv
wird standardmäßig nichts "
wenn für das Gehäuse param eingeleitet. Google wird mir versagt (Ergebnisse für eine ganze Reihe von Seiten über fputcsv
Rückkehr) und PEAR Bibliotheken tun mehr oder weniger die gleichen Dinge wie fputcsv
.
Etwas, das genau wie fputcsv
funktioniert, aber werden die Felder, damit nicht notierte bleiben.
zur Zeit: "field 1","field 2",field3hasNoSpaces
gewünscht: field 1,field 2,field3hasNoSpaces
Lösung
Die Warnungen über den Verzicht Gehäuse sind gültig, aber Sie gesagt haben sie gelten nicht für Ihren Anwendungsfall.
Ich frage mich, warum man nicht einfach so etwas wie diese verwenden kann?
<?php
$fields = array(
"field 1","field 2","field3hasNoSpaces"
);
fputs(STDOUT, implode($fields, ',')."\n");
Andere Tipps
arbeitet mit chr () Funktion:
fputcsv($f,$array,',',chr(0));
fputcsv($file, $data, ';', chr(127));
Ist das nicht?
fputcsv($fp, split(',', $line),',',' ');
Nun car(0)
nicht funktioniert hat, wie der NULL
Wert wird höchstwahrscheinlich die meist csv Parser ersticken.
I ended fputcsv()
mit der ursprünglichen Datei zu bauen, dann ging durch und entfernt alle Zitate. Elegant? Vielleicht nicht, aber es wurde die Arbeit erledigt.)
<?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',
);
Ich verwende perfide Weise doppelte Anführungszeichen zu entfernen, aber nur unter Linux
....
fputcsv($fp, $product_data,"\t");
....
shell_exec('sed -i \'s/"//g\' /path/to/your-file.txt ');
Dies ist, was ich Standard-CSV in ein Array setzen verwenden ...
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;
}
Sie können dann ausgegeben, was Sie in einer foreach-Schleife soll.
Der Nachteil mit einem CSV-Datei ohne Gehäuse bedeutet ein fehlerhaftes Komma in Benutzereingabe wird die Zeile munge. So müssen Sie Kommas entfernen, bevor Sie eine CSV-Zeile zu schreiben.
Der schwierige Teil mit dem Umgang mit CSV ist Parsing-Gehäuse, die die PHP & PEAR CSV Funktionen wertvoll macht. Im Wesentlichen sind Sie für eine Datei, die für die Zeilen für Spalten und Newline-separierte kommagetrennte ist. Hier ist ein einfacher Ausgangspunkt:
<?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)
auch für mich gearbeitet:
fputcsv($fp, $aLine, $sDelimiter, chr(0));
es herausgefunden. Durch die Übergabe in dem ASCII-Code für Null an die car()
Funktion scheint es ganz gut zu arbeiten.
fputcsv($f, $array, $delimiter, car(0))
Danke für die Antworten jeden !!!