Écrire un fichier CSV dans un fichier sans boîtiers en PHP
Question
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 (en renvoyant les résultats de 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 permet aux champs de rester sans citation.
actuellement: "champ 1", "champ 2", champ3 n'a pas d'espaces
souhaité: champ 1, champ 2, champ3 n'a pas d'espaces
La solution
Les avertissements concernant les enceintes précédentes sont valides, mais vous avez dit qu'ils ne s'appliquaient pas à votre cas d'utilisation.
Je me demande pourquoi vous ne pouvez pas utiliser quelque chose comme ça?
<?php
$fields = array(
"field 1","field 2","field3hasNoSpaces"
);
fputs(STDOUT, implode($fields, ',')."\n");
Autres conseils
fonctionne avec la fonction chr () :
fputcsv($f,$array,',',chr(0));
fputcsv ($ fichier, $ données, ';', chr (127));
Cela ne fonctionne-t-il pas?
fputcsv($fp, split(',', $line),',',' ');
Eh bien, car (0)
n'a pas fonctionné, car la valeur NULL
va probablement étouffer la plupart des analyseurs au format csv.
J'ai fini par utiliser fputcsv ()
pour construire le fichier initial, puis j'ai supprimé et supprimé tous les guillemets. É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, mais uniquement sous Linux
....
fputcsv($fp, $product_data,"\t");
....
shell_exec('sed -i \'s/"//g\' /path/to/your-file.txt ');
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.
L’inconvénient d’un fichier CSV sans encadrement signifie qu’une virgule erronée dans la saisie de l’utilisateur modifiera la ligne. Vous devrez donc supprimer les virgules avant d'écrire une ligne CSV.
La difficulté avec la gestion des fichiers CSV consiste à analyser les boîtiers, ce qui rend PHP & amp; PEAR CSV fonctionne très bien. 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));
?>
chr (0)
a également fonctionné pour moi:
fputcsv($fp, $aLine, $sDelimiter, chr(0));
Je l'ai compris. En passant le code ascii pour Null à la fonction car ()
, il semble fonctionner parfaitement.
fputcsv ($ f, $ tableau, $ délimiteur, voiture (0))
Merci pour les réponses à tous !!!