2009-11-25 14 views
32

C'è una funzione nativa o di classe solido/biblioteca per la scrittura di un array come una riga in un file CSV senza custodie? fputcsv imposterà automaticamente su " se non viene passato nulla per il parametro enclosure. Google mi sta venendo a mancare (corrispondente alla ricerca tutta una serie di pagine su fputcsv), e le librerie di PEAR fare più o meno le stesse cose di fputcsv.scrittura CSV Per file senza Contenitori In PHP

Qualcosa che funziona esattamente come fputcsv, ma consentirà ai campi di rimanere non quotati.

attualmente: "field 1","field 2",field3hasNoSpaces

desiderato: field 1,field 2,field3hasNoSpaces

+6

Penso che tu abbia bisogno delle virgolette ... cosa succede se c'è un carattere di nuova riga o una virgola e non sono delimitate da virgolette? – alex

+1

Le quotazioni sono a tuo vantaggio. È una buona pratica usarli; è per questo che sono l'impostazione predefinita. –

+5

Non sono d'accordo; se si ha il controllo dei dati di input, si potrebbe voler omettere gli allegati, in particolare se è possibile esportare tutti i dati di stringa numerici/filtrati su un lettore arcaico. L'altra cosa sono i file separati da tabulazioni: non hanno bisogno di allegati. –

risposta

42

Le avvertenze relative ai suddetti allegati sono valide, ma avete affermato che non si applicano al caso d'uso.

mi chiedo perché non si può semplicemente usare qualcosa di simile?

<?php 
$fields = array(
    "field 1","field 2","field3hasNoSpaces" 
); 
fputs(STDOUT, implode($fields, ',')."\n"); 
+0

Non so perché non sono andato a questo prima. Grazie! –

+0

Poiché le librerie CSV gestiscono i casi in cui la tua soluzione implode semplice non funziona, come scaping del carattere separatore (',' nel tuo caso). – jgomo3

+0

Questo è il modo migliore per sostituire fputcsv senza enclosure. Vorrei fare un piccolo suggerimento per migliorare questa risposta - usa l'ordine degli argomenti documentati per [implode] (http://php.net/manual/en/function.implode.php): 'implode (string $ glue, array $ pieces) 'per evitare confusione con persone che sono nuove in PHP e non conoscono questa" caratteristica "di PHP degli argomenti invertiti. – hrvoj3e

0

Questo è quello che uso per mettere standard CSV in un array ...

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; 
} 

è quindi possibile uscita quello che vuoi in un foreach ciclo continuo.

2

Non funziona?

fputcsv($fp, split(',', $line),',',' '); 
+0

Split sarà una funzione deprecata e questo non risolve necessariamente il mio problema con i contenitori . Purtroppo gli spazi non sono considerati un personaggio legit almeno per quanto riguarda questa funzione. Grazie comunque! –

+0

Supponendo che lo spazio extra non sia un problema, sembra che stia cercando * no * enclosure; tuttavia, usare uno spazio sembra la cosa più logica da provare. –

0

Lo svantaggio con un file CSV senza enclosure indica una virgola errante nell'input dell'utente che munge la riga. Quindi dovrai rimuovere le virgole prima di scrivere una riga CSV.

La parte difficile con la gestione di CSV è l'analisi di custodie, il che rende preziose le funzioni CSV PHP & PEAR. In sostanza, stai cercando un file che sia delimitato da virgole per colonne e delimitato da righe per le righe. Ecco un semplice punto di partenza:

<?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)); 

?> 
-3

Capito. Passando nel codice ASCII per Null alla funzione car(), sembra funzionare correttamente.

fputcsv($f, $array, $delimiter, car(0))

Grazie per le risposte tutti !!!

+3

Hmm ... sei sicuro che non metterà un sacco di numeri stealth nel file csv? : s Inoltre, penso che sia 'chr (0)' -! –

+2

Mette NULL per me. Non la soluzione ideale. – Shadowbob

1

Il pozzetto car(0) non ha funzionato in quanto il valore NULL molto probabilmente soffocherà la maggior parte dei parser csv.

Ho terminato l'uso di fputcsv() per creare il file iniziale, quindi ho esaminato e rimosso tutte le virgolette. Elegante? Forse no, ma ha fatto il lavoro :).

8

opere con chr() funzione:

fputcsv($f,$array,',',chr(0)); 
+2

-1 non funziona per me – mkk

+4

Sembra che nei file UTF-8 non funzioni correttamente – terox

+3

chr (0) crea null char che viene visualizzato in utf8 come^@ – Mike

0

chr(0) lavorato anche per me:

fputcsv($fp, $aLine, $sDelimiter, chr(0)); 
+1

Penso che funzioni perché il tuo editor non ti mostra il carattere null, ma è ancora lì – nickel715

1
<?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', 
); 
1

fputcsv($file, $data, ';', chr(127));