IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Séparateur pour exportation CSV


Sujet :

PHP & Base de données

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 412
    Par défaut Séparateur pour exportation CSV
    Bonjour à tous,

    je fais des exportation filtrées de ma table en CSV.

    Pour cela, j'utilise ce script.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
    <?php
    $jourG = $_GET["jourtest"];
    $date_limite = date("Y-m-d",$mod_date);
     
     
     
     
    $conn = mysql_connect('****', '****', '****') or die(mysql_error());
    mysql_select_db('****', $conn) or die(mysql_error($conn));
     
     
    /*
    * execute sql query
    */
     
     
    $query = sprintf('select grd, nom, date_grv from grv where date_grv2 = "'.$jourG.'" and date_demande2 < "'.$date_limite.'"');
    $result = mysql_query($query, $conn) or die(mysql_error($conn));
     
     
    /*
    * send response headers to the browser
    * following headers instruct the browser to treat the data as a csv file called export.csv
    */
     
     
    header('Content-Type: text/csv');
    header('Content-Disposition: attachment;filename=export.csv');
     
     
    /*
    * output header row (if atleast one row exists)
    */
     
     
    $row = mysql_fetch_assoc($result);
    if ($row) {
        echocsv(array_keys($row));
    }
     
     
    /*
    * output data rows (if atleast one row exists)
    */
     
     
    while ($row) {
        echocsv($row);
        $row = mysql_fetch_assoc($result);
    }
     
     
    /*
    * echo the input array as csv data maintaining consistency with most CSV implementations
    * - uses double-quotes as enclosure when necessary
    * - uses double double-quotes to escape double-quotes
    * - uses CRLF as a line separator
    */
     
     
    function echocsv($fields)
    {
        $separator = '';
        foreach ($fields as $field) {
            if (preg_match('/\\r|\\n|,|"/', $field)) {
                $field = '"' . str_replace('"', '""', $field) . '"';
            }
            echo $separator . $field;
            $separator = ',';
        }
        echo "\r\n";
    }
    ?>
    Il fonctionne bien à un détail prêt, lorsque j'ouvre mon exportation dans Excel, il me met tout dans une seule colonne séparé par des virgules.

    moi j'aimerai que tous les :

    grd - soient dans la colonna A
    nom - soient dans la colonne B
    Etc.....

    pourriez vous m'aider?.

    Merci de votre implication

  2. #2
    Membre chevronné Avatar de ddaweb
    Homme Profil pro
    Webmaster amateur
    Inscrit en
    Janvier 2013
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Webmaster amateur
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2013
    Messages : 329
    Par défaut
    Il me semble que pour ouvrir un CSV dans Excel, le séparateur n'est pas , mais ;

  3. #3
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 983
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 983
    Par défaut
    Je ne suis pas expert en Excel mais tu peux spécifier le délimiteur utilisé. De mémoire:
    • Clique sur l'onglet données
    • Clique sur l'icône à partir d'un texte (ou quelque chose comme ça)
    • Là tu devrais obtenir la fenêtre d'un assistant où il faudra préciser que tes données sont bien délimitées (et non de taille fixe) et que le délimiteur est la virgule.

    Désolé de ne pas être plus précis mais ça fait un bail que je n'utilise plus Excel.

    Une autre solution glanée sur le web serait que la première ligne du fichier précise le délimiteur (de cette façon sep=,, ce que Excel serait en mesure de repérer), mais c'est un peu problématique, car si cela permet à Excel d'identifier le délimiteur utilisé, ça risque de poser problème pour d'autres utilisation du CSV.

    Pour information, le "format" CSV n'a pas de spécification, c'est donc la jungle en ce qui concerne les variantes, les séparateurs de champs (délimiteurs), les séparateurs d'enregistrements (de lignes), la présence ou l'absence d'entête, l'échappement des caractères de protection (les guillemets) ...

    En résumé, c'est un format de merde très utilisé.

    Pour ce qui est de ton code PHP, qui finalement n'est pas l'objet de ta question, je pense qu'il intéressera nombre d'archéologues en particulier pour son utilisation exclusive de cette grande famille injustement oubliée que constituent les fonctions mysql_*.

  4. #4
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 313
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 313
    Billets dans le blog
    17
    Par défaut
    Il existe la RFC 4180 pour les CSV => https://www.rfc-editor.org/rfc/rfc4180

    Le problème d'Excel, est qu'il localise les CSV (en France le séparateur est ; et non , merci MS), et qu'en l'absence de BOM l'affichage est moche.

    Si tu veux produire un CSV à destination d'Excel il faut donc :
    -- Poser un BOM "\xEF\xBB\xBF"
    -- Oublier tes fonctions persos et utiliser fputcsv() qui s'occupe parfaitement du format
    -- Format à adopter : $separator = ';' $enclosure = '"' $escape = ''
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ...
    $csv_options = ['separator' => ';', 'enclosure' => '"', 'escape' => ''];
    $stream = fopen('php://output', 'w'); // Sortie directe vers le navigateur
    fwrite($stream, "\xEF\xBB\xBF"); // BOM, pour la bonne gestion des accents sur Excel
    foreach ($rows as $i => $row) {
        if ($i === 0) {
            fputcsv($stream, array_keys($row), ...$csv_options);
        }
        fputcsv($stream, $row, ...$csv_options);
    }

Discussions similaires

  1. Language pour Export CSV to SQL Server
    Par AdriPIC dans le forum Windows
    Réponses: 1
    Dernier message: 08/05/2019, 22h06
  2. [RegEx] Les guillemets dans un texte pour export csv
    Par renaud26 dans le forum Langage
    Réponses: 6
    Dernier message: 09/11/2015, 19h48
  3. [XL-2007] Macro pour export CSV
    Par jinx69 dans le forum Excel
    Réponses: 6
    Dernier message: 22/07/2015, 16h43
  4. Moulinette pour export csv d'une base de données
    Par freestyler dans le forum C#
    Réponses: 6
    Dernier message: 16/02/2007, 11h57
  5. [Excel] séparateur pour les fichiers csv
    Par drinkmilk dans le forum Excel
    Réponses: 2
    Dernier message: 27/08/2005, 14h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo