Export CSV - Problème espace en trop
Bonjour à tous,
Je viens vers vous car j'ai un soucis que je vous détails ci-dessous.
L'entreprise pour laquelle je travail, va changer d'ERP/CRM pour sa gestion en générale.
Pour ce faire je dois exporter en fichier CSV les informations clients afin de pouvoir les importer dans le nouvel ERP/CRM.
J'ai donc mis en place une page d'exportation.
Tout d'abord, pour faciliter l'export j'utilise une fonction personnelle qui va convertir un tableau en fichier CSV
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| <?php
/**
* @p (sgtring) : Chemin vers le dossier
* @f (string) : Nom du fichier
* @a (array) : Tableau PHP contenant les lignes à écrire dans leCSV
**/
function arrToCsv($p,$f,$a){
// On ouvre le fichier en lecture / ecriture, Si le fichier n'existe pas on tente de le créer
$fp = fopen($p.'/'.$f.'.csv', 'w+');
// Parcours le tableau
foreach($a as $b){
// Ajoute au fichier la ligne en cours (elle-même un tableau incrémenté, sans clés définie)
fputcsv($fp, $b, ";",' ');
}
// Ferme le fichier
fclose($fp);
// Un petit retour vite fait ( j'aime pas les fonction sans retour :p )
return true;
}
?> |
Mais voilà, chaque données que je vais enregistrée va se retrouvée avec des espaces supplémentaires.
Exemple avec des données de base tel que le nom et prénom.
Dans ma base de données le nom est séparé du prénom, mais pas dans le nouvel ERP
Donc je doit formater ma donnée ce que je fait bien évidemment.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| <?php
$tmp = array();
$req = "SELECT * FROM clients";
$qry = $pdo->query($req);
while($r = $qry->fetch(PDO::FETCH_ASSOC)){
$nameFormated = $r['nom'].' '.$r['prenom']; // On concatène le nom et prénom pour le rendre compatible
$tmp2 = array('name' => $nameFormated);
$tmp[] = $tmp2;
}
// Juste pour les tests
echo '<pre>';
print_r($tmp);
echo '</pre>';
// Maintenant je converti en CSV
$nameFile = 'export-'.time(); // Nom du nouveau fichier
arrToCsv('mods/Exports/csv',$nameFile,$arr); // Converti mon tableau en CSV
echo '<a href="mods/Exports/csv/'.$nameFile.'.csv">mods/Exports/csv/'.$nameFile.'.csv</a>';
?> |
Mais voilà le print_r me retourne bien un tableau avec nom et prénom
Citation:
Array(
[0] => array(
[0] => 'Mon Nom et Prénom'
),
[1] => array(
[0] => 'Mon Nom 1 et Prénom 1'
),
etc...
)
Pas de soucis l'affichage est correct, mais étrangement mon fichier CSV double chaque espace qu'il trouve et j'obtiens des données avec des double espace
Code:
1 2 3 4
| Affichage :
Mon Nom et Prénom
CSV :
Mon Nom et Prénom |
Même les noms et prénom composés qui sont bien encodés avec un espace dans la base de données MySQL, se retrouve avec un deuxième espace vide dès qu'un espace est rencontrés.
Ce que je ne comprend pas, puisque rien dans le code ou la base de données n'est sensé doublé chaque espace qu'il croise.
Ma table de ma BDD MySQL est en "innoDB" et utf8_genéral_ci
Mon fichier PHP est au format windows et encodé en utf8
Logiquement pas de conflit dû à l'encodage de caractère.
Si quelqu'un à une piste je suis preneur :p
D'avance merci de votre participation.
Belle journée
Spliffer