Existe-t-il une fonction native ou une classe/bibliothèque solide pour écrire un tableau sous forme de ligne dans un fichier CSV sans enceintes? fputcsv
passera par défaut à "
si rien n'est transmis pour le paramètre Enclosure. Google me manque (retourne des résultats pour tout un tas de pages sur fputcsv
), et les bibliothèques de PEAR font plus ou moins les mêmes choses que fputcsv
.
Quelque chose qui fonctionne exactement comme fputcsv
, mais permettra aux champs de rester sans citation.
actuellement: "field 1","field 2",field3hasNoSpaces
désiré: field 1,field 2,field3hasNoSpaces
Les avertissements concernant les enceintes précédentes sont valables, mais vous avez dit qu'ils ne s'appliquaient pas à votre cas d'utilisation.
Je me demande pourquoi vous ne pouvez pas simplement utiliser quelque chose comme ça?
<?php
$fields = array(
"field 1","field 2","field3hasNoSpaces"
);
fputs(STDOUT, implode($fields, ',')."\n");
fonctionne avec chr () function:
fputcsv($f,$array,',',chr(0));
fputcsv($file, $data, ';', chr(127));
Ça ne marche pas?
fputcsv($fp, split(',', $line),',',' ');
car(0)
n'a pas fonctionné, car la valeur NULL
étranglerait probablement la plupart des analyseurs au format csv.
J'ai fini par utiliser fputcsv()
pour construire le fichier initial, puis j'ai supprimé et supprimé toutes les citations. Élégant? Peut-être pas, mais le travail a été fait :).
<?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',
);
J'utilise un moyen délicat pour supprimer les guillemets doubles, mais uniquement sous Linux
....
fputcsv($fp, $product_data,"\t");
....
Shell_exec('sed -i \'s/"//g\' /path/to/your-file.txt ');
chr(0)
a également travaillé pour moi:
fputcsv($fp, $aLine, $sDelimiter, chr(0));
L'inconvénient d'un fichier CSV sans pièce jointe signifie qu'une virgule erronée dans l'entrée de l'utilisateur modifiera la ligne. Vous devrez donc supprimer les virgules avant d'écrire une ligne CSV.
La partie délicate de la gestion des fichiers CSV consiste à analyser les enceintes, ce qui rend les fonctions CSV PHP & PEAR utiles. Vous recherchez essentiellement un fichier délimité par des virgules pour les colonnes et délimité par des lignes pour les lignes. Voici un point de départ simple:
<?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));
?>
C’est ce que j’utilise pour mettre un fichier CSV standard dans un tableau ...
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;
}
Vous pouvez ensuite sortir ce que vous voulez dans une boucle foreach.