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

Langage PHP Discussion :

fichier csv construit avec file_put_contents pas vu par excel comme un csv


Sujet :

Langage PHP

  1. #1
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 497
    Billets dans le blog
    1
    Par défaut fichier csv construit avec file_put_contents pas vu par excel comme un csv
    Bonjour,

    pour construire un fichier csv de test, je suis parti d'un fichier csv puis j'ai entouré chaque valeur par des doubles quotes (abcde=>"abcde") le tout en PHP. Mon souci est que excel ne le prend pas comme un fichier csv, car chaque ligne est affichée dans une cellule unique (les retours à la ligne sont corrects). Il y a probablement une erreur dans le code. Merci de me l'indiquer :

    Code php : 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
     
    <!-- form to download a csv file from the hard disk -->
    <form action="" method="post" enctype="multipart/form-data">
        <label for="file2"><b>File CSV</b></label>
        <input type="file" name="file2" id="file2"><br/>
        <input type="submit" name="submitfile2" value="csv file download"><br/>
        </form>
    <?php
    if (!defined('DIR_ROOT')) define('DIR_ROOT', dirname(__DIR__).DIRECTORY_SEPARATOR);
     
    if (isset($_POST['submitfile2'])) 
    {
         //to put the file into an array ($data): each cell of the array contents a line of the csv file
         if (!$_FILES['file2']["error"]) {   //if not error
            $upload_dir = 'csv';
            $name=$_FILES['file2']['name'];
     
         if ( false === $handle = fopen(DIR_ROOT.$upload_dir.DIRECTORY_SEPARATOR.$name, 'r') )
            throw new Exception("impossible to open the file '$name'");
     
         // one reads the header
         $buffer = 4096;
     
         if ( false === ($header = fgets($handle, $buffer)) )
             throw new Exception("The file '$name' is empty");
     
         // one tests different separators
         $sep = ','; // by default
         $separators = [',', ';'];
     
         foreach ($separators as $separator) {
             if ( strpos($header, $separator)> 0) { 
                 $sep = $separator;
                 break;
             }
         } 
     
         function addDb($str)
         {
             return('"'.$str.'"');
         }
     
         while (false !== ($fields = fgetcsv($handle, $buffer, $sep)) ) {       
             $fields_convert=[];  
     
            foreach($fields AS $str_fields)
            {
                 $str_fields=addDb($str_fields);
                 $fields_convert[]=$str_fields;
            } 
     
            $line_csv=implode(",", $fields_convert);
            file_put_contents('exemple.csv', $line_csv."\r\n", FILE_APPEND );     // serveur Windows , donc \r\n
         }
     
        }   //end if not error
    }
    ?>

    exemple de ligne résultat :
    "SESA100008","(none)","Software Engineering","SESA69723","CollabNet","TeamForge_Full","","TRUE","Jul 26, 2018","","","France","firstname1","lastname1","Schneider Electric France","TYS5","","Industry Business","CARROS HORIZON","firstname1.lastname1@schneider-electric.com","firstname2","lastname2","firstname2.lastname2@schneider-electric.com"

  2. #2
    Invité
    Invité(e)
    Par défaut


    [EDIT] Je viens de tester avec (Microsoft) Excel : en version française, il faut des points-virgules.


    ...Ce problème est dû aux options régionales et linguistiques de votre système d’exploitation....[...]

    lorsque vous utilisez la version anglaise du système d’exploitation Microsoft Windows 7, la langue par défaut sélectionnée est l’anglais (États-Unis). À cause de cela, le séparateur par défaut est une virgule (,). [...]
    Cependant, si votre fichier a été créé dans une autre langue, par exemple le français, les données sont séparées par des point-virgules (.[...]
    Dernière modification par Invité ; 27/12/2019 à 19h01.

  3. #3
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 497
    Billets dans le blog
    1
    Par défaut
    oui merci ; ça a l'air bien plus adapté. Néanmoins, je dois me tromper dans son utilisation :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    //to read the csv file
         $csv_array=[];
         while (false !== ($fields = fgetcsv($handle, $buffer, $sep)) ) {       
             $csv_array[]=$fields;  
         }
     
         // to build the new csv file, with " enclosure
         if ( false == ($handle2 = fopen(DIR_ROOT.'exemple.csv', 'w')))
            throw new Exception("impossible to open the file '$name'");
        fputcsv($handle2,$csv_array,";",'"');

    donne
    Notice: Array to string conversion in C:\wamp64\www\ticket_tools\tools\lastCarIsADq.php on line 11
    [EDIT]J'ai vu ton EDIT dans le post précédent ; j'ai corrigé mon code puis mon post : l'erreur est la même sauf qu'elle porte sur une autre ligne...
    [EDIT2]La langue de mon Windows10 est le français

  4. #4
    Invité
    Invité(e)
    Par défaut
    Tu devrais LIRE LA DOC !

    fputcsv — Formate une ligne en CSV et l'écrit dans un fichier
    Or, $csv_array contient TOUTES les lignes.

    Essaye :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    	// --------
    	$delimiteur = ';';
    	$enclosure = '"';
    	// --------
    	// Boucle foreach sur chaque ligne du tableau
    	foreach($csv_array as $csv_row)
    	{
    		// les valeurs présentes dans chaque ligne seront séparées par $delimiteur
    		fputcsv($handle2, $csv_row, $delimiteur, $enclosure);
    	}
    	// --------
    	// fermeture du fichier csv
    	fclose($handle2);

  5. #5
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 497
    Billets dans le blog
    1
    Par défaut
    J'ai fait cet essai :

    Code php : 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
     
     
         // to build the new csv file, with " enclosure
       /*  if ( false == ($handle2 = fopen(DIR_ROOT.'exemple.csv', 'w')))
            throw new Exception("impossible to open the file '$name'");
        fputcsv($handle2,$csv_array,";",'"');*/
     
    	// --------
    	$delimiteur = ';';
    	$enclosure = '"';
    	// --------
    	// Boucle foreach sur chaque ligne du tableau
    	foreach($csv_array as $csv_row)
    	{
    		fputcsv($handle2, $csv_row, $delimiteur, $enclosure);
    	}
    	// --------
    	// fermeture du fichier csv
    	fclose($handle2);

    Notice: Undefined variable: handle2 in C:\wamp64\www\ticket_tools\tools\lastCarIsADq.php on line 15
    Warning: fputcsv() expects parameter 1 to be resource, null given in C:\wamp64\www\ticket_tools\tools\lastCarIsADq.php on line 15
    fois le nombre de lignes du csv d'origine.

    [EDIT]si je remets l'ouverture du fichier csv (création de $handle2), ça supprime les messages d'erreur mais le fichier reste vide.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Tu vois bien que tu NE comprends PAS ce que tu écris !

    Pourquoi as-tu commenté la ligne 4, alors que c'est ELLE :
    • qui définit $handle2 !
    • qui OUVRE le fichier csv !!


  7. #7
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 497
    Billets dans le blog
    1
    Par défaut
    Oui, j'ai vu : cf mon edit, post précedent. C'est pas encore gagné.

  8. #8
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 497
    Billets dans le blog
    1
    Par défaut
    J'ai refait un essai après dîner. Le fichier csv n'est pas vide. Mais sur 23 valeurs par lignes, seules 5 sont encadrées par des doubles quotes... Comme mon code a évolué, je le redonne :
    Code php : 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
     
      //to read the csv file
     
         if ( false === $handle = fopen(DIR_ROOT.$upload_dir.DIRECTORY_SEPARATOR.$name, 'r') )
         throw new Exception("impossible to open the file '$name'");
     
         $csv_array=[];
         while (false !== ($fields = fgetcsv($handle, $buffer, $sep)) ) {       
             $csv_array[]=$fields;  
         }
     
         // to build the new csv file, with " enclosure
        if ( false == ($handle2 = fopen(DIR_ROOT.'exemple.csv', 'w')))
            throw new Exception("impossible to open the file '$name'");
       /* fputcsv($handle2,$csv_array,";",'"');*/
     
    	// --------
    	$delimiteur = ';';
    	$enclosure = '"';
    	// --------
    	// Boucle foreach sur chaque ligne du tableau
    	foreach($csv_array as $csv_row)
    	{
    		fputcsv($handle2, $csv_row, $delimiteur, $enclosure);
    	}
    	// --------
    	// fermeture du fichier csv
    	fclose($handle2);

  9. #9
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    salut,

    est-ce que ton tableau ne contient que des valeur de type string ?
    sinon corrige cette partie et réessaie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while (false !== ($fields = fgetcsv($handle, $buffer, $sep)) ) {       
        $csv_array[] = array_map('strval', $fields);
    }

  10. #10
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 497
    Billets dans le blog
    1
    Par défaut
    Merci pour ta réponse ; j'ai essayé, mais c'est pareil.

  11. #11
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    sinon, tu peux aussi tout forcer à la main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $data = [];
    $clbk = function($p) { return '"'.str_replace('"', '\"', $p).'"'; };
    foreach ($csv_array as $csv_row) {
        $data[] = implode(';', array_map($clbk, $csv_row));
    }
    file_put_contents(DIR_ROOT.'exemple.csv', implode("\n", $data));
    ça fonction aussi très bien et au moins t'es sûr du résultat obtenu.

  12. #12
    Invité
    Invité(e)
    Par défaut
    Oui mais là... On fait un bond en arrière...
    Le but est qu'il soit capable d'utiliser les fonctions appropriées.

    Laurent :
    - Montre un extrait (quelques lignes) du fichier csv d'origine (qu'on puisse TESTER)
    - Fais un débogage de base : echo, var_dump
    - Montre le résultat
    - Montre le fichier csv généré.

  13. #13
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 497
    Billets dans le blog
    1
    Par défaut
    Pas dispo avant...J'ai testé le code de Martin ; effectivement, il marche, mais comme le dit Jérôme, il vaut mieux un code que je comprenne (ce qui n'est pas le cas avec le code de Martin).

    Donc je suis reparti du code du post #8 auquel j'ai rajouté un var_dump :

    Code php : 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
     
     //to read the csv file
     
         if ( false === $handle = fopen(DIR_ROOT.$upload_dir.DIRECTORY_SEPARATOR.$name, 'r') )
         throw new Exception("impossible to open the file '$name'");
     
         $csv_array=[];
         while (false !== ($fields = fgetcsv($handle, $buffer, $sep)) ) {       
            $csv_array[]=$fields;  
        }
              // to build the new csv file, with " enclosure
        if ( false == ($handle2 = fopen(DIR_ROOT.'exemple.csv', 'w')))
            throw new Exception("impossible to open the file '$name'");
     
    	// --------
    	$delimiteur = ';';
    	$enclosure = '"';
    	// --------
    	// Boucle foreach sur chaque ligne du tableau
    	foreach($csv_array as $csv_row)
    	{
                   var_dump($csv_row);
                   fputcsv($handle2, $csv_row, $delimiteur, $enclosure);
    	}
    	// --------
    	// fermeture du fichier csv
    	fclose($handle2);

    Je le teste sur le csv simplifié suivant :
    SESAID;ALTERNATEIDS;PLATFORM;PLATFORMOWNER;PUBLISHER;APPLICATIONNAME;HFMCODE;CURRENTLYACTIVE;ACTIVATEDATE;DEACTIVATEDATE;GROUPNAME;OFFICECOUNTRY;FIRSTNAME;LASTNAME;COMPANYNAME;JOBCODE;REPORTINGENTITY;BUSINESSUNITNAME;LOCATION;INTERNETADDRESS;MANAGERFIRSTNAME;MANAGERLASTNAME;MANAGEREMAIL
    SESA100008;(none);Software Engineering;SESA69723;CollabNet;TeamForge_Full;;TRUE;Jul 26, 2018;;;France;firstname1;lastname1;Schneider Electric France;TYS5;;Industry Business;CARROS HORIZON;firstname1.lastname1@schneider-electric.com;firstname2;lastname2;firstname2.lastname2@schneider-electric.com
    ça affiche :
    File CSV


    C:\wamp64\www\ticket_tools\tools\lastCarIsADq.php:61:
    array (size=23)
    0 => string 'SESAID' (length=6)
    1 => string 'ALTERNATEIDS' (length=12)
    2 => string 'PLATFORM' (length=8)
    3 => string 'PLATFORMOWNER' (length=13)
    4 => string 'PUBLISHER' (length=9)
    5 => string 'APPLICATIONNAME' (length=15)
    6 => string 'HFMCODE' (length=7)
    7 => string 'CURRENTLYACTIVE' (length=15)
    8 => string 'ACTIVATEDATE' (length=12)
    9 => string 'DEACTIVATEDATE' (length=14)
    10 => string 'GROUPNAME' (length=9)
    11 => string 'OFFICECOUNTRY' (length=13)
    12 => string 'FIRSTNAME' (length=9)
    13 => string 'LASTNAME' (length=8)
    14 => string 'COMPANYNAME' (length=11)
    15 => string 'JOBCODE' (length=7)
    16 => string 'REPORTINGENTITY' (length=15)
    17 => string 'BUSINESSUNITNAME' (length=16)
    18 => string 'LOCATION' (length=8)
    19 => string 'INTERNETADDRESS' (length=15)
    20 => string 'MANAGERFIRSTNAME' (length=16)
    21 => string 'MANAGERLASTNAME' (length=15)
    22 => string 'MANAGEREMAIL' (length=12)

    C:\wamp64\www\ticket_tools\tools\lastCarIsADq.php:61:
    array (size=23)
    0 => string 'SESA100008' (length=10)
    1 => string '(none)' (length=6)
    2 => string 'Software Engineering' (length=20)
    3 => string 'SESA69723' (length=9)
    4 => string 'CollabNet' (length=9)
    5 => string 'TeamForge_Full' (length=14)
    6 => string '' (length=0)
    7 => string 'TRUE' (length=4)
    8 => string 'Jul 26, 2018' (length=12)
    9 => string '' (length=0)
    10 => string '' (length=0)
    11 => string 'France' (length=6)
    12 => string 'firstname1' (length=10)
    13 => string 'lastname1' (length=9)
    14 => string 'Schneider Electric France' (length=25)
    15 => string 'TYS5' (length=4)
    16 => string '' (length=0)
    17 => string 'Industry Business' (length=17)
    18 => string 'CARROS HORIZON' (length=14)
    19 => string 'firstname1.lastname1@schneider-electric.com' (length=43)
    20 => string 'firstname2' (length=10)
    21 => string 'lastname2' (length=9)
    22 => string 'firstname2.lastname2@schneider-electric.com' (length=43)
    et le csv résultat :
    SESAID;ALTERNATEIDS;PLATFORM;PLATFORMOWNER;PUBLISHER;APPLICATIONNAME;HFMCODE;CURRENTLYACTIVE;ACTIVATEDATE;DEACTIVATEDATE;GROUPNAME;OFFICECOUNTRY;FIRSTNAME;LASTNAME;COMPANYNAME;JOBCODE;REPORTINGENTITY;BUSINESSUNITNAME;LOCATION;INTERNETADDRESS;MANAGERFIRSTNAME;MANAGERLASTNAME;MANAGEREMAIL
    SESA100008;(none);"Software Engineering";SESA69723;CollabNet;TeamForge_Full;;TRUE;"Jul 26, 2018";;;France;firstname1;lastname1;"Schneider Electric France";TYS5;;"Industry Business";"CARROS HORIZON";firstname1.lastname1@schneider-electric.com;firstname2;lastname2;firstname2.lastname2@schneider-electric.com

  14. #14
    Invité
    Invité(e)
    Par défaut
    Oui... Et donc ?
    As-tu essayé de l'ouvrir avec Excel ?

    N.B. Manifestement, la fonction n'ajoute des double-quotes QUE lorsqu'il y a des espaces (et certainement aussi le caractère de séparation !).
    Sinon, ce n'est pas nécessaire.

  15. #15
    Invité
    Invité(e)
    Par défaut
    Rien d'anormal, donc.

  16. #16
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 497
    Billets dans le blog
    1
    Par défaut
    Peut-être pas anormal, mais pour effectuer mon test sur ce genre de csv (toutes les données sont encadrées par des doubles quotes), je souhaite générer ce type de fichier.

Discussions similaires

  1. Réponses: 2
    Dernier message: 09/05/2016, 17h57
  2. Réponses: 0
    Dernier message: 07/04/2016, 18h28
  3. [AC-2007] Champs TEXT de fichier CSV tronqués à 255 C. par ADO avec le Microsoft Text Driver
    Par zardoz45 dans le forum Requêtes et SQL.
    Réponses: 0
    Dernier message: 05/04/2016, 23h05
  4. [Python 2.X] Créer un écrire un fichier de données avec Python ? Pas de CSV ou .txt !
    Par Ben20 dans le forum Général Python
    Réponses: 5
    Dernier message: 16/04/2015, 12h22
  5. Créer un fichier texte contenant des ; sans les " imposés par Excel
    Par man_coef dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 04/12/2012, 21h22

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