2010-09-28 8 views
10

Also generiert mein Code eine CSV-Datei mit PHP integrierten fputcsv Funktion.Wrap CSV-Werte von PHP erzeugt fputcsv() mit ""

Als Trennzeichen verwende ich ',' (ein Komma).
Für das Gehäuse verwende ich '"' (ein Doppel-Zitat).

Allerdings, wenn ich versuche, so etwas wie

fputcsv($file,array('a','b',"long string, with commas",NULL,''),',','"'); 

es gibt

a,b,"long string, with commas",, 

aber ich würde es ausgeben wie

"a","b","long string, with commas","","" 

Gibt es eine einfache Möglichkeit, um damit umzugehen , oder müsste ich einen Ersatz für fputcsv schreiben?

+1

Die Ausgabe ist eine gültige CSV-Datei. Dein anderes Werkzeug ist kaputt. –

+0

Warum möchten Sie die Anführungszeichen für jedes Feld? –

+1

@Ignacio, Andrew: Anscheinend ist es in einer kleinen Ecke des Importdialogs in einer Tabellenkalkulationssoftware versteckt, mehrere leere Felder ('a ,,, =>' a, ') zu komprimieren und/oder zu entfernen (' a ,,, '=>' a'). Und anscheinend haben einige Benutzer dies überprüft und wissen es nicht, also ist die einfache, universelle Lösung, jedes leere Feld zu einem leeren String zu machen ('a," "," "," "'). –

Antwort

9

Dies ist normalerweise kein Problem für CSV-Dateien.

fputcsv legt Anführungszeichen um den Wert, wenn es mehrdeutig wäre. Zum Beispiel

a,b,"long string, with commas",, 

ist nicht mehrdeutig, sondern

a,b,long string, with commas,, 

ist, und in den meisten wird (sprich: alle) Fälle von den CSV-Lesern interpretiert werden, da mehr als 5 Felder haben.

CSV-Parser akzeptieren Zeichenfolgenliterale auch ohne Anführungszeichen.

Wenn Sie die Werte trotzdem in Anführungszeichen setzen möchten, würde das folgende Snippet das tun. Es entweicht nicht Anführungszeichen innerhalb der Zeichenfolge - die Übung dem Leser überlassen wird:

$row = '"' . implode('", "', $rowitems) . '"'; 

Sie würden wollen, dass diese für alle Zeilen in einer Schleife setzen.

+0

Ja, ich kenne die Ambiguität, aber es sind wirklich die leeren Teile, die ich in Anführungszeichen verpackt brauche. Ich kann ohne die nicht leeren Teile leben, die eingewickelt werden (abgesehen von den mehrdeutigen, natürlich). –

+0

Ihr Kommentar ist verwirrend. Sie möchten, dass die leeren Teile in Anführungszeichen eingeschlossen werden, aber die nicht leeren Teile könnten ohne Umhüllung gehen? Was meinst du? Das gesendete Snippet wird in Anführungszeichen eingeschlossen, was mit allen CSV-Parsern funktionieren sollte. –

+0

Macht nichts. Ich war ein bisschen verwirrt. Ja, das sollte funktionieren. Vielen Dank. –

0

Jeder Grund, den Sie nicht str_replace (',,', ',' ", ', $ output); ? Sie müssten auch sehen, ob der letzte oder erste Zeichen ein Komma ist, und wenn ja, ersetzen Sie das Komma mit „“

+0

Das war eigentlich mein erster Gedanke, aber dann müsste ich die Datei abfangen-auf eine Zeichenfolge schreiben. D: –

+1

Ah ja. Ganz vergessen darüber nachzudenken, was fputcsv tatsächlich tut hah. Sie schreiben besser Ihre eigene Funktion, die den Daten entkommt und sie mit fputs oder fwrite ausgibt. – methodin

2

Ich denke Lösung wird so sein,

$order_header_arr = array("Item1", "Item2","This is Item3"); 
fputcsv($fp, $order_header_arr,',',' '); 

erinnern " " [Leer ] Zwischen dem dritten Parameter von fputcsv

+0

Das ist die sauberste und schnellste Antwort – RafaSashi

8

Ich arbeitete um dieses herum, indem Sie einige falsche String-Zeichen mit einem Leerzeichen # @ @ # einfügen und sie dann entfernen. Hier ist eine Beispielimplementierung:

//$exported is our array of data to export 
$filename = 'myfile.csv'; 
$fp = fopen($filename, 'w'); 
foreach ($exported as $line => $row) { 
    if ($line > 0) { 
     foreach ($row as $key => $value) { 
       $row[$key] = $value."#@ @#"; 
     } 
    } 
    fputcsv($fp, $row); 
} 

fclose($fp); 
$contents = file_get_contents($filename); 
$contents = str_replace("#@ @#", "", $contents); 
file_put_contents($filename, $contents); 

Dies umfasst alle Felder in doppelte Anführungszeichen, auch leere

+0

Obwohl das Öffnen und Schließen der Datei eine zusätzliche Zeit dauert, funktioniert es gut. – iamjonesy

+0

Damit können Sie es auch für ein bestimmtes Feld statt alle Spalten +1 – input

+0

wenig langsam aber die einzige Möglichkeit, dies richtig zu funktionieren, danke! – Damian

0

fputcsv nicht alle Array-Variablen in Anführungszeichen setzen. Wenn Sie einen numerischen Array-Wert ohne Anführungszeichen verwenden, ist das zwar korrekt, aber es stellt ein Problem dar, wenn ein Label oder ein Adressprogramm auf eine numerisch definierte US-Postleitzahl trifft, da die führenden Nullen beim Drucken entfernt werden. So wird 05123-0019 zu 5123-19.

Um alle Werte, ob vorhanden oder nicht, in Anführungszeichen zu setzen, lese ich die Eingabedatei mit fgetsrc und schreibe eine korrigierte Version mit fwrite. fgetsrc liest den Datensatz in Array-Variablen. Da fwrite eine Variable schreibt, müssen Sie die Array-Variablen stringulieren, sie in Anführungszeichen einschließen und die Array-Variable durch ein Komma trennen. Fügen Sie dann das Datensatztrennzeichen hinzu.

<?php 
// fgetcsv - read array with fgetcsv and string into output variable 
// then write with fwrite 
// $ar is the array populated from fgetcsv and $arc is the variable strung 
// with array variables enclosed in quotes and written using fwrite. 
$file_in = fopen("reinOCp.csv","r") or die("Unable to open input file 
reinOCp.csv!"); 
$file_out = fopen("printLABEL.csv", "w") or die("Unable to open output file 
prtLABEL!"); 
while (!feof($file_in)) { //loop through each record of the input file 
    $ar=fgetcsv($file_in); //read the record into array $ar 
    if (is_array($ar)){ //this loop will string all the array values plus 
// the end of record into variable $arc and then write the variable 
     $arc = ""; //clear variable $arc 
     foreach ($ar as $value) {  
      $arc .= '"' . $value . '",'; // add the array values, enclose in 
// quotes with comma separator and store in variable $arc 
     } 
     $arc .= "\n"; //add end of record to variable $arc 
     fwrite($file_out, $arc) or die ("ERROR: Cannot write the file"); 
//write the record using variable $arc 
    } 
} 
echo "end of job"; 
fclose($file_in); 
fclose($file_out); 
?>