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

Vue hybride

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 401
    Points : 5 756
    Points
    5 756
    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"
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  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
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 401
    Points : 5 756
    Points
    5 756
    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
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  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
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 401
    Points : 5 756
    Points
    5 756
    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.
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  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 !!


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