Page 1 sur 1

Fichier CSV. Titre des colones en deux lignes.

Posté : 10 oct. 2007, 18:59
par Camomille
Salut à vous,

J'arrive à exporter les résultats d'une requête dans un *.csv. J'employe un echo pour afficher le titre des colones mais ça fait assez désordre quand ce titre est trop long.
Voici une portion de mon code:
[$resQuery = mysql_query("SELECT nation,but,leftday,sejour,personnes,unités FROM $table WHERE leftmois=$month AND year=$annee AND statut='Parti'  ORDER BY leftday");


header("Content-Type: application/csv-tab-delimited-table");
header("Content-disposition: filename=$mois.csv");

  // titre des colonnes
 echo "Code du Pays ; But du séjour ; Jour du départ ; Nombre de nuitées  ;  Nombre de personnes  ;  Nombre d'unités occupées  \n";
 
  echo "\n";
  // données de la table
  while ($arrSelect = mysql_fetch_array($resQuery, MYSQL_ASSOC)) {
   foreach($arrSelect as $elem) {
    echo "$elem;";
   }
   echo "\n";
  }
Cela me donne des colones dont le titre est à moitié caché et m'oblige à élargir mes colones manuellement. Je crois que je pourrais éviter cela en affichant le titre des colones sur deux ligne comme ceci:
Code du ; But du ; Jour du ; Nombre de ; Nombre de ; Unités
Pays........séjour....départ nuitées personnes
NB: J'ai du ajouter quelques points car les espaces n'ont pas été pris en compte dans le "
"
Peut-être existe-t-il une solution moins tordue que celle que j'emploie!!!

Mille mercis pour vos précieux conseils

Bien amicalement.

Camomille

Posté : 10 oct. 2007, 20:48
par Tracker
Le format CSV n'a pas pour vocation d'être humainement lisible, c'est un format d'échange normalisé (RFC 4180) et tu ne peux donc pas faire ce qu'il te plait.
Pour arriver à un document valide, gestion des dates, caractères d'échapement, encodage, valeurs multilignes, etc..., tu vas devoir potasser le texte de la RFC en détail... Ton malheureux echo "$elem;" n'a pas beaucoup de sens aux vues des contraintes que tu as à respecter.

Alors conseils:
- Regarde si une librairie n'est pas déjà développée dans ce but.
- ODBC sait sans doute utiliser les fichiers CSV comme source de données, donc tu peux imaginer t'en servir pour produire ton document.

a+

Posté : 11 oct. 2007, 04:20
par Patriboom
Pourquoi ne fais-tu pas tout simplement deux lignes d'en-tête ainsi :
echo "Code ; But du ; Jour du ; Nombre ;  Nombre   ;  Nombre d'unités \n";
echo "du Pays ;éjour ; départ ; de nuitées  ;de personnes  ; occupées  \n";

 
:?:

Posté : 11 oct. 2007, 12:46
par Camomille
Merci pour vos réponses :!:

Ta solution marche très bien Patriboom. J'avais déjà cherché dans cette direction mais en ne mettant des ";" que sur une seule ligne !!

@ Tracker
J'ignore comment mon fichier sera traité ou lu par son destinataire. Je pouvais aussi remplir un "xls template" mais j'aurais eu du mal à automatiser cela. Je me suis basé sur la présentation du template pour la présentation de mon CSV, histoire d'avoir la satisfaction d'avoir fait quelque chose de propre et présentable. Je viens d'envoyer un exemplaire de "mon csv" à l'institut des statistiques pour avoir leur avis (accord) sur ma présentation. Je vous tiens au courrant!!

Encore mille mercis pour votre aide et vos conseils.

Camomille

Posté : 11 oct. 2007, 15:52
par Ryle
Raah bah non pas deux lignes d'entêtes... c'est tout pas beau, pis c'est galère à éditer, récupérer ou traiter.

Pour mettre un retour à la ligne dans une cellule suffit de coller un \n et de délimiter la cellule avec des guillemets pis le tour est joué :) (et doubler les éventuelles guillemets qu'elle pourrait contenir)

Code : Tout sélectionner

"Code\ndu Pays";"But du\nSéjour"; ... ; "Nombre d'""unités"" occupées"
(Penser en php à protéger les guillemets ou apostrophes selon la déclaration de la chaine :))

Posté : 11 oct. 2007, 19:21
par Camomille
Merci Grand Chef.

C'est vrai que ta soluce et plus logique mais avec tous ces guillemets, il n'y a que l'entête de la première colone qui s'affiche. Le "But du\nSéjour" comme tout ce qui est après le 1er " ; "est ignoré!

Quelle est la syntaxe exacte de mon echo pour afficher toutes les entêtes?

Un grand merci d'avance.

Bien amicalement.

Camomille

Posté : 11 oct. 2007, 19:38
par Tracker
Si ton projet tourne en version >= 5.1.0RC1
utilises:
fputcsv(...)

Posté : 12 oct. 2007, 10:26
par Ryle
Il y a effectivement des fonctions toutes faites pour générer et lire des fichiers csv, donc autant les utiliser si possible :)

Mais sinon, pour rappel, en php une chaine délimitée par des guillemets peut contenir des apostrophes, mais si elle contient des guillemets, celles-ci doivent être échapées par des antislashes (De même une chaine délimitée par des apostrphes peut contenir des guillemets, mais doit échapper les apostrophes qu'elle contient

La chaine

Code : Tout sélectionner

"Code\ndu Pays";"But du\nSéjour"; ... ; "Nombre d'""unités"" occupées"
donne en php
echo "\"Code\ndu Pays\";\"But du\nSéjour\"; ... ; \"Nombre d'\"\"unités\"\" occupées\"";

// ou délimitée avec des apostrophes (plus lisible) :
echo '"Code\ndu Pays";"But du\nSéjour"; ... ; "Nombre d\'""unités"" occupées"'; 
A noter que seules les valeurs comportant un retour charriot ou au moins une guillemet ont besoin d'être délimités.

Le meilleur moyen de le constater c'est de te faire un fichier excel avec tes titres de colonnes, de l'enregistrer au format csv et de l'ouvrir dans un bloc-note. Tu verras ainsi la tête qu'il a et ce à quoi doit ressembler la chaine à générer avec php :)