Domanda

Esiste una funzione nativa o una solida classe / libreria per scrivere un array come una linea in un file CSV senza allegati? fputcsv verrà automaticamente impostato su " se non viene passato nulla per il parametro enclosure. Google mi sta fallendo (restituendo risultati per un sacco di pagine su fputcsv ) e le librerie di PEAR fanno più o meno le stesse cose di fputcsv .

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

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

desiderato: campo 1, campo 2, field3hasNoSpaces

È stato utile?

Soluzione

Le avvertenze su quanto sopra menzionato sono valide, ma hai detto che non si applicano al tuo caso d'uso.

Mi chiedo perché non puoi semplicemente usare qualcosa del genere?

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

Altri suggerimenti

funziona con la funzione chr () :

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

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

Non funziona?

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

Bene car (0) non ha funzionato dato che il valore NULL molto probabilmente soffocerà la maggior parte dei parser CSV.

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

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

Uso un modo complicato per rimuovere la doppia virgoletta, ma solo in Linux

....
fputcsv($fp, $product_data,"\t");
....
shell_exec('sed -i \'s/"//g\' /path/to/your-file.txt ');

Questo è quello che uso per inserire CSV standard 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 eseguire l'output di ciò che si desidera in un ciclo foreach.

Il rovescio della medaglia con un file CSV senza allegati significa che una virgola errata nell'input dell'utente cancellerà la riga. Quindi dovrai rimuovere le virgole prima di scrivere una riga CSV.

La parte difficile della gestione di CSV è l'analisi dei recinti, che rende PHP & amp; PEAR CSV ha un valore prezioso. In sostanza, stai cercando un file delimitato da virgole per le colonne e delimitato da nuova riga 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));

?>

chr(0) ha funzionato anche per me:

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

Capito. Passando il codice ascii per Null alla funzione car () sembra funzionare bene.

fputcsv ($ f, $ array, $ delimitatore, auto (0))

Grazie per le risposte a tutti !!!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top