2010-03-25 8 views
7

ero sul punto di fare le stesse domande come la questione aksed qui .... Forcing fputcsv to Use Enclosure For *all* Fieldsphp fputcsv e racchiudono campi

La domanda era

Quando uso fputcsv di scrivere una linea a un handle di file aperto, PHP aggiungerà un carattere di inclusione a qualsiasi colonna che ritiene necessaria, ma lo sarà lasciando le altre colonne senza gli allegati .

Per esempio, si potrebbe finire con una linea come questo

11, "Bob", Jenkins, "200 st principale. Stati Uniti d'America ", ecc

Breve aggiungendo uno spazio fasullo per alla fine di ogni campo, non v'è alcun modo per forzare fputcsv racchiudere sempre colonne con l'involucro (default ad una ") personaggio?

La risposta è stata:

No, fputcsv() racchiude solo il campo nelle seguenti condizioni

/* enclose a field that contains a delimiter, an enclosure character, or a newline */ 
if (FPUTCSV_FLD_CHK(delimiter) || 
    FPUTCSV_FLD_CHK(enclosure) || 
    FPUTCSV_FLD_CHK(escape_char) || 
    FPUTCSV_FLD_CHK('\n') || 
    FPUTCSV_FLD_CHK('\r') || 
    FPUTCSV_FLD_CHK('\t') || 
    FPUTCSV_FLD_CHK(' ') 
) 

Non esiste alcuna opzione "sempre racchiudere".

Ho bisogno di creare un file CSV sarà racchiuso in ogni campo ... Quale sarebbe la soluzione migliore?

Grazie in anticipo ...

+0

Cambiare le sorgenti di php potrebbe essere un'opzione? Cioè sta aggiungendo un flag "racchiudi sempre" ai parametri di funzione fattibili nel tuo caso? – VolkerK

risposta

7

rullo la propria funzione - la sua non è difficile:

function dumbcsv($file_handle, $data_array, $enclosure, $field_sep, $record_sep) 
{ 
    dumbescape(false, $enclosure); 
    $data_array=array_map('dumbescape',$data_array); 
    return fputs($file_handle, 
     $enclosure 
     . implode($enclosure . $field_sep . $enclosure, $data_array) 
     . $enclosure . $record_sep); 
} 
function dumbescape($in, $enclosure=false) 
{ 
    static $enc; 
    if ($enclosure===false) { 
     return str_replace($enc, '\\' . $enc, $in); 
    } 
    $enc=$enclosure; 
} 

(sopra sta usando lo stile unix fuga)

C.

+0

$ file_handle, $ data_array, $ enclosure, $ field_sep, $ record_sep - puoi vedere quali valori devono essere passati ... per favore ... grazie in anticipo – Anudeep

+0

$ file_handle quale valore deve passare per questa variabile @symcbean – Anudeep

+0

restituzioni fput ($ file_handle, $ enclosure . implode ($ enclosure. $ Field_sep. $ Enclosure, $ data_array) . $ Enclosure. $ Record_sep); Ricevo errore in questa riga Messaggio: Array to string conversion – Anudeep

1

Una soluzione : Supponendo di avere i tuoi dati in una matrice bidimensionale, puoi aggiungere una stringa che costringerà le citazioni e sei sicuro di non essere contenuta nei tuoi dati ("# @ @ #" qui) e quindi rimuovere it:

$fp = fopen($filename, 'w'); 
    foreach ($data as $line => $row) { 
     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); 
Problemi correlati