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

War es hilfreich?

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 !!!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top