php fputcsv e allegando i campi
Domanda
Stavo per chiedere le stesse domande la domanda aksed qui.... Costringendo fputcsv Utilizzare Custodia Per *tutti* i Campi
La domanda era
Quando uso fputcsv per scrivere una riga per un handle di file aperto, PHP aggiungere un allegando carattere a qualsiasi colonna che si ritiene necessario, ma lasciare le altre colonne senza custodie.
Per esempio, si potrebbe finire con un riga come questa
11,"Bob ",Jenkins,"200 main st.USA ",ecc
Breve di aggiungere un falso spazio per alla fine di ogni campo, c'è qualche un modo per forzare l'fputcsv per racchiudere sempre le colonne con la custodia (impostazioni predefinite per un " carattere?
La risposta è stata:
No, fputcsv() solo racchiude il campo sotto le 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 c'è "di racchiudere sempre" opzione.
Ho bisogno di creare un file CSV di ogni campo recintato...Quale sarebbe la soluzione migliore?
Grazie in anticipo...
Soluzione
Arrotolare la funzione 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 utilizza in stile unix in fuga)
C.
Altri suggerimenti
Una soluzione alternativa:Supponendo di avere i vostri dati in un 2-matrice bidimensionale, è possibile aggiungere una stringa forza citando e sono sicuro che non è contenuta nei dati ("#@ @#" qui) e poi rimuoverlo:
$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);