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 :

lire un csv pour l'envoyé dans une DBD


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Femme Profil pro
    en formation
    Inscrit en
    Septembre 2019
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : en formation

    Informations forums :
    Inscription : Septembre 2019
    Messages : 90
    Points : 79
    Points
    79
    Par défaut lire un csv pour l'envoyé dans une DBD
    Bonjour
    J’explique mon problème:
    Je dois lire un fichier CSV (meteo.csv) :
    exemple :
    2013-12-05;Paris;matin;ensoleillé;1;5;8;Temps ensoleillé mais frais
    2013-12-05;Paris;"Après_midi";Pluvieux;1;9;11;Une pluie fine est attendue
    2013-12-05;Paris;nuit;Nuageux;4;9;11;Temps Couvert
    2013-12-06;Paris;matin;Brumeux;1;12;13;Temps Brumeux
    2013-12-06;Paris;"Après_midi";ensoleillé;1;14;15;Temps Ensoleillé
    2013-12-06;Paris;nuit;Nuageux;4;9;11;Temps Nuageux
    2013-12-07;Paris;matin;Brumeux;1;12;13;Temps Brumeux
    2013-12-07;Paris;"Après_midi";ensoleillé;2;14;15;Temps Ensoleillé
    2013-12-07;Paris;nuit;Nuageux;4;9;11;Temps Nuageux

    pour ensuite le rentre dans uns base de donné.

    sur la date du 2013-12-05 seul la troisième ligne est insérer dans la base.
    J'arrive à faire rentrer les lignes correspondant à matin et nuit mais celle avec la période après-midi impossible.
    SI l'un d'entre vous arrive à voir pourquoi je l'en remercie franchement d'avance.

    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
     PHP
     
    <?php
    $mysqli = new mysqli('localhost', 'root', '', 'projet_meteo');
    			$mysqli->set_charset("utf8");
    			if ($mysqli->connect_errno) 	{
    				echo 'Echec de la connection' . $mysqli->connect_error;
    				exit();
    			}	
     
    if (($handle = fopen("meteo.csv", "r")) !== FALSE) {
        while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
     
           $date = $data[0];
           $ville = $data[1];
           $periode = $data[2];
           $resume = $data[3];
           $id_resume = $data[4];
           $temp_min = $data[5];
           $temp_max = $data[6];
           $commentaire = $data[7];
     
            $mysqli->query('INSERT INTO meteo (day, ville, periode, resume, id_resume, temp_min, temp_max, commentaire) VALUES ("'. $date .'" , "'. $ville .'" ,"'. $periode .'" , "'. $resume .'" , "'. $id_resume .'" , "'. $temp_min .'" , "'. $temp_max .'" , "'. $commentaire .'")');
            var_dump($mysqli);
     
        }
     
    }    
     
    ?>

  2. #2
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 468
    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 468
    Points : 5 826
    Points
    5 826
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    que donne un var_dump($data) placé à la ligne 13 ?

    Et quand tu dis "impossible", y a un message d'erreur à l'exécution de la requête d'insertion ?

  3. #3
    Membre du Club
    Homme Profil pro
    Architecte réseau
    Inscrit en
    Août 2018
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Architecte réseau

    Informations forums :
    Inscription : Août 2018
    Messages : 40
    Points : 44
    Points
    44
    Par défaut
    pour après midi ...
    c 'est normal que ca ne passe pas vu que la valeur est entre double quote dans ton CSV contrairement a matin et a nuit.
    ce qui donne dans ton insert :
    INSERT INTO meteo (day, ville, periode, ...) VALUES ( "2013-12-05" ,"Paris" ,""Après_midi"" ... )

    j'espere qu il n y as pas de station metéo a L'Isle-Adam ce qui va generer le meme type de problème ;-)


    si tes fichiers CSV restent de taille raisonnable ( < qq Mo)



    je conseil de proceder de la facon suivante pour s'éviter la majorité des problemes :

    a)lire le fichier ligne par ligne et mettre chaque ligne dans un array()
    b) faire un foreach()sur l'array pour chaque ligne faire une explode() de la variable avec ; comme séparateur
    c) compter le nombre de champs créé avec count() et verifier que le nombre de champs est bien celui attendu
    d) enfin avant d'inserer en base utiliser une fonction qui vire tout les caracteres spéciaux
    tu trouvera des exemples dans les commentaire de cette page du manuel php :
    https://www.php.net/manual/en/mysqli...ape-string.php

    ce qui evitera que la base sois peuplé avec tout et n'importe quoi :-)

  4. #4
    Membre régulier
    Femme Profil pro
    en formation
    Inscrit en
    Septembre 2019
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : en formation

    Informations forums :
    Inscription : Septembre 2019
    Messages : 90
    Points : 79
    Points
    79
    Par défaut
    Citation Envoyé par laurentSc Voir le message
    Bonjour,
    que donne un var_dump($data) placé à la ligne 13 ?
    Tous d'abord Merci de t'a réponse.

    Et quand tu dis "impossible", y a un message d'erreur à l'exécution de la requête d'insertion ?
    Pour le var dump j'ai tous les éléments qui ce pressente. Et pas de message d'erreur. Seulement il me manque les aprés-midi et la première ligne du premier jours. C'est vraiment étrange.

    0 => string '2013-12-05' (length=10)
    1 => string 'Paris' (length=5)
    2 => string 'matin' (length=5)
    3 => string 'ensoleill�' (length=10)
    4 => string '1' (length=1)
    5 => string '5' (length=1)
    6 => string '8' (length=1)
    7 => string 'Temp ensoleill� mais frais' (length=26)

    C:\wamp\www\meteo\test.php:11:
    array (size=8)
    0 => string '2013-12-05' (length=10)
    1 => string 'Paris' (length=5)
    2 => string 'Apr�s_midi' (length=10)
    3 => string 'Pluvieux' (length=8)
    4 => string '1' (length=1)
    5 => string '9' (length=1)
    6 => string '11' (length=2)
    7 => string 'Une pluie fine est attendue' (length=27)

    C:\wamp\www\meteo\test.php:11:
    array (size=8)
    0 => string '2013-12-05' (length=10)
    1 => string 'Paris' (length=5)
    2 => string 'nuit' (length=4)
    3 => string 'Nuageux' (length=7)
    4 => string '4' (length=1)
    5 => string '9' (length=1)
    6 => string '11' (length=2)
    7 => string 'Temp Couvert' (length=12)

    C:\wamp\www\meteo\test.php:11:
    array (size=8)
    0 => string '2013-12-06' (length=10)
    1 => string 'Paris' (length=5)
    2 => string 'matin' (length=5)
    3 => string 'Brumeux' (length=7)
    4 => string '1' (length=1)
    5 => string '12' (length=2)
    6 => string '13' (length=2)
    7 => string 'Temp Brumeux' (length=12)

    C:\wamp\www\meteo\test.php:11:
    array (size=8)
    0 => string '2013-12-06' (length=10)
    1 => string 'Paris' (length=5)
    2 => string 'Apr�s_midi' (length=10)
    3 => string 'ensoleill�' (length=10)
    4 => string '1' (length=1)
    5 => string '14' (length=2)
    6 => string '15' (length=2)
    7 => string 'Temps Ensoleill�' (length=16)

    C:\wamp\www\meteo\test.php:11:
    array (size=8)
    0 => string '2013-12-06' (length=10)
    1 => string 'Paris' (length=5)
    2 => string 'nuit' (length=4)
    3 => string 'Nuageux' (length=7)
    4 => string '4' (length=1)
    5 => string '9' (length=1)
    6 => string '11' (length=2)
    7 => string 'Temps Nuageux' (length=13)

    C:\wamp\www\meteo\test.php:11:
    array (size=8)
    0 => string '2013-12-07' (length=10)
    1 => string 'Paris' (length=5)
    2 => string 'matin' (length=5)
    3 => string 'Brumeux' (length=7)
    4 => string '1' (length=1)
    5 => string '12' (length=2)
    6 => string '13' (length=2)
    7 => string 'Temps Brumeux' (length=13)

    C:\wamp\www\meteo\test.php:11:
    array (size=8)
    0 => string '2013-12-07' (length=10)
    1 => string 'Paris' (length=5)
    2 => string 'Apr�s_midi' (length=10)
    3 => string 'ensoleill�' (length=10)
    4 => string '2' (length=1)
    5 => string '14' (length=2)
    6 => string '15' (length=2)
    7 => string 'Temps Ensoleill�' (length=16)

    C:\wamp\www\meteo\test.php:11:
    array (size=8)
    0 => string '2013-12-07' (length=10)
    1 => string 'Paris' (length=5)
    2 => string 'nuit' (length=4)
    3 => string 'Nuageux' (length=7)
    4 => string '4' (length=1)
    5 => string '9' (length=1)
    6 => string '11' (length=2)
    7 => string 'Temps Nuageux' (length=13)

  5. #5
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 468
    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 468
    Points : 5 826
    Points
    5 826
    Billets dans le blog
    1
    Par défaut
    Je suppute un problème d'encodage (utf-8) de la bbd (les accents ne passeraient pas). Peux-tu donner le DDL de ta table SQL ?

  6. #6
    Membre régulier
    Femme Profil pro
    en formation
    Inscrit en
    Septembre 2019
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : en formation

    Informations forums :
    Inscription : Septembre 2019
    Messages : 90
    Points : 79
    Points
    79
    Par défaut
    Citation Envoyé par laurentSc Voir le message
    Je suppute un problème d'encodage (utf-8) de la bbd (les accents ne passeraient pas). Peux-tu donner le DDL de ta table SQL ?
    Bonjour LaurentSc.

    Ne sachant pas ce qu'est le DDL j'ai fait un export SQL. (Je suis en formation ESECAD.

    j’espère que ça répondra à t'a question.

    projet_meteo.sql

  7. #7
    Membre régulier
    Femme Profil pro
    en formation
    Inscrit en
    Septembre 2019
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : en formation

    Informations forums :
    Inscription : Septembre 2019
    Messages : 90
    Points : 79
    Points
    79
    Par défaut
    Citation Envoyé par nagyp Voir le message
    Bonjour LaurentSc.

    Ne sachant pas ce qu'est le DDL j'ai fait un export SQL. (Je suis en formation ESECAD.

    J'ai supprimer les accents de mon fichier CSV et ça fonctionne.
    J'ai utf8_general_ci.
    Il me semblais que ca ne poser pas de souci avec les accents mais à priori si.
    Je ne sait pas quoi choisir.


    projet_meteo.sql

  8. #8
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 468
    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 468
    Points : 5 826
    Points
    5 826
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    DDL=Data Language Definition. Dans ton cas, c'est :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    DROP TABLE IF EXISTS `meteo`;
    CREATE TABLE IF NOT EXISTS `meteo` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `day` date DEFAULT NULL,
      `ville` text,
      `periode` text,
      `resume` text,
      `id_resume` int(11) DEFAULT NULL,
      `temp_min` int(11) DEFAULT NULL,
      `temp_max` int(11) DEFAULT NULL,
      `commentaire` text,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;
    COMMIT;
    chez moi, ton code fonctionne (je l'ai testé). Cela dit, je pense que ça vient des accents. Essaie ce code qui les enlève :
    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
    <?php
    function debug($location, $var) // cette fonction aide au debug (tu peux l'enlever)
    {
        echo "<br/>".(is_string($location))?$location:''."<br/><pre>";
        var_dump($var);
        echo "</pre><br/>";
    }
     
    $mysqli = new mysqli('localhost', 'root', '', 'projet_meteo');
    $mysqli->set_charset("utf8");
    if ($mysqli->connect_errno) 	{
        echo 'Echec de la connection' . $mysqli->connect_error;
        exit();
    }
     
    if (($handle = fopen("meteo.csv", "r")) !== FALSE) {
        while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
            //debug("ligne csv 18",$data);
            $data_utf8=[];
            foreach($data as $item_data){
                $var=str_replace('é','e',$item_data);
                $data_utf8[]=str_replace('è','e',$var);
                }
     
            $date = $data_utf8[0];
            $ville = $data_utf8[1];
            $periode = $data_utf8[2];
            $resume = $data_utf8[3];
            $id_resume = $data_utf8[4];
            $temp_min = $data_utf8[5];
            $temp_max = $data_utf8[6];
            $commentaire = $data_utf8[7];
     
            $mysqli->query('INSERT INTO meteo (day, ville, periode, resume, id_resume, temp_min, temp_max, commentaire) VALUES ("'. $date .'" , "'. $ville .'" ,"'. $periode .'" , "'. $resume .'" , "'. $id_resume .'" , "'. $temp_min .'" , "'. $temp_max .'" , "'. $commentaire .'")');
            //var_dump($mysqli);
     
        }
     
    }
     
    ?>
    Le nom $data_utf8 vient de ma première idée, mais c'est pas ça.

  9. #9
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2009
    Messages : 35
    Points : 64
    Points
    64
    Par défaut
    Bonjour
    Au début je pataugeais dans les transferts de données vers mysql
    Maintenant ma stratégie est la suivante:
    1- créer ou récupérer un fichier csv dans libre-office en UTF8
    2- opérations diverses pour assainir les données comme transformer l'apostrophe en ´ (pas obligatoire mais rend service pour éviter les stripslashes dans PHP)
    3- sauvegarder en prenant soit # ou £ comme séparateur (faire une recherche dans libreoffice pour voir leur absence)
    4- vider les données de la table Mysql (prendre soin de faire une copie, on sait jamais)
    5-importer le fichier csv en utf8 avec le délimiteur choisi (attention le nombre de champs du fichier csv doit correspondre avec ceux de la table)
    Malgré cette stratégie, la semaine dernière erreur dans le nombre de champs (libre-office enregistrait le fichier avec un dernier champ vide)


    PS: après avoir relu les messages, je pense que c'est encore ces satanés guillemets qui ne sont pas échappées avant incorporation dans le BDD Depuis que j'ai changé par ´ je n'ai plus ce problème et je constate que de plus en plus de site commerciaux adoptent aussi cette stratégie même si un léger décalage à l'affichage se produit.

  10. #10
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 888
    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 888
    Points : 6 632
    Points
    6 632
    Par défaut
    Tu dois préparer ta requête (comme tu dois toujours le faire), au lieu de faire des concaténations pour la construire.

  11. #11
    Invité
    Invité(e)
    Par défaut
    Bonjour,


    1-
    0 => string '2013-12-05' (length=10)
    1 => string 'Paris' (length=5)
    2 => string 'matin' (length=5)
    3 => string 'ensoleill�' (length=10)
    4 => string '1' (length=1)
    5 => string '5' (length=1)
    6 => string '8' (length=1)
    7 => string 'Temp ensoleill� mais frais' (length=26)
    Manifestement, le fichier meteo.csv n'est PAS encodé en UTF-8.

    Pour y remédier (SANS supprimer les accents) : on encode les données avec utf8_encode() .

    Solution 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if (($handle = fopen("meteo.csv", "r")) !== false) {
        while (($data = fgetcsv($handle, 1000, ";")) !== false) {
     
    	$data = array_map('utf8_encode', $data); // encode en UTF-8 chaque données dans l' array $data (TOUTES en une fois)
     
           $date = $data[0];
           $ville = $data[1];
           $periode = $data[2];
    ...
    Solution 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    if (($handle = fopen("meteo.csv", "r")) !== false) {
        while (($data = fgetcsv($handle, 1000, ";")) !== false) {
     
           $date = utf8_encode($data[0]); // encode en UTF-8 la donnée (UNE par une)
           $ville = utf8_encode($data[1]);
           $periode = utf8_encode($data[2]);
    ...

    2- Suis le conseil de CosmoKnacki, et utilise des requêtes préparées !


    @saveus et resus
    Pour "Après_midi", NON, car ces guillemets sont automatiquement enlevés par la fonction fgetcsv().
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     fgetcsv ( resource $handle [, int $length = 0 [, string $delimiter = "," [, string $enclosure = '"' [, string $escape = "\\" ]]]] ) : array
    Il s'agit de $enclosure = '"' (guillemet, par défaut).


    @laurentSc
    DDL = Data Definition Language = Langage de définition de données (LDD en Français)
    Dernière modification par Invité ; 30/04/2020 à 13h56.

  12. #12
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 468
    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 468
    Points : 5 826
    Points
    5 826
    Billets dans le blog
    1
    Par défaut
    Jérôme,
    j'ai testé ton code (d'ailleurs, avant d'enlever les accents, je l'avais déjà fait), mais si on encode en utf8 le fichier CSV, on a des caractères moches en bdd (é et è )

  13. #13
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par laurentSc Voir le message
    ...on a des caractères moches en bdd (é et è )
    Ça, ça veut certainement dire que TON fichier meteo.csv EST DÉJÀ en UTF-8.
    Du coup, utf8_encode le traite une 2ème fois : ce qui n'est pas bon.

    Fais un var_dump( $data ); AVANT et APRÈS utf8_encode, pour voir.

  14. #14
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 468
    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 468
    Points : 5 826
    Points
    5 826
    Billets dans le blog
    1
    Par défaut
    Oui, c'est bien ça. Je ne mets pas ici ce que ça donne vu qu'on est dans le while et donc qui y en a pleins, mais l'affichage est correct avant l'encodage...

  15. #15
    Invité
    Invité(e)
    Par défaut
    @laurentSc

    1- Voici une fonction qui devrait t'intéresser, et te servir :

    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
    // on vérifie l'encodage de la donnée, et si PAS UTF-8, on l'encode en UTF-8
    function utf8_check_encode_data( $datas )
    {
    	// 1- array (données multiples)
    	if( is_array($datas) )
    	{
    		foreach( $datas as $i => $data )
    		{
    			if( empty(mb_detect_encoding($data, 'UTF-8', true)) )
    			{
    				$datas[$i] = utf8_encode( $data );
    			}
    		}
    	} 
    	// 2- donnée simple
    	else {
    			if( empty(mb_detect_encoding($datas, 'UTF-8', true)) )
    			{
    				$datas = utf8_encode( $datas );
    			}
    	}
    	return $datas;
    }
    A l'usage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?php
    if (($handle = fopen("meteo.csv", "r")) !== false) {
        while (($data = fgetcsv($handle, 1000, ";")) !== false) {
     
    	$data = array_map('utf8_check_encode_data', $data); // (SI NECESSAIRE) -> encode en UTF-8 chaque donnée dans l' array $data (TOUTES en une fois)
    AINSI, que le fichier CSV soit encodé OU PAS en UTF-8, les données récupérées sont en UTF-8.
    Dernière modification par Invité ; 30/04/2020 à 14h55.

  16. #16
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 468
    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 468
    Points : 5 826
    Points
    5 826
    Billets dans le blog
    1
    Par défaut

  17. #17
    Invité
    Invité(e)
    Par défaut
    2- Une autre solution est de détecter l'encodage du fichier complet, en amont :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
    $file_datas = file_get_contents('meteo.csv');
    $is_utf8 = ( !empty(mb_detect_encoding($file_datas, 'UTF-8', true)) ); // true si UTF-8 / false si PAS UTF-8;
     
    if (($handle = fopen("meteo.csv", "r")) !== false) {
        while (($data = fgetcsv($handle, 1000, ";")) !== false) {
     
    	if( !$is_utf8 ) // si PAS UTF-8 -> on encode
    	{
    		$data = array_map('utf8_encode', $data); // encode en UTF-8 chaque données dans l' array $data (TOUTES en une fois)
    	}

    Plus simple, mais à voir ce que ça vaut en terme de performance... ... et s'il n'existe pas DÉJÀ des fonctions natives PHP qui font le job ! (je n'ai pas trouvé)
    Dernière modification par Invité ; 30/04/2020 à 18h43.

  18. #18
    Membre du Club
    Homme Profil pro
    Architecte réseau
    Inscrit en
    Août 2018
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Architecte réseau

    Informations forums :
    Inscription : Août 2018
    Messages : 40
    Points : 44
    Points
    44
    Par défaut
    avec les fichiers en UTF8 il y as une histoire de BOM qui peu parfois poser problème entre windows et linux.


    question , les données sont fourni directement en CSV . ou elle sont stoquées a l'origine dans un fichier type excel ?


    car si c'est le cas il pourrait etre plus intéressant de passer par de l'ODBC , que par du CSV


    https://www.supinfo.com/articles/sin...c-excel-access

    il existe aussi une version linux (unixodbc)



    exemple pour configurer une base avec un fichier open office :
    https://www.easysoft.com/application..._org/odbc.html

    et ca permet de faire des requete SQL directement sur des fichier type EXCEL , sans passer par de l'importation de CSV en table temporaire
    et permet de récuperer par exemple uniquement les enregistrements du jour , sans etre obliger de se taper des milliers de lignes a importer a chaque fois

  19. #19
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 888
    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 888
    Points : 6 632
    Points
    6 632
    Par défaut
    Autre méthode pour passer le csv en utf-8: on utilise iconv comme filtre de flux:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if ( false !== $handle = fopen('php://filter/read=convert.iconv.iso-8859-15.utf-8/resource=meteo.csv', 'r') ) {
        while ( false !== $data = fgetcsv($handle, 1000, ';') ) { // etc.

  20. #20
    Invité
    Invité(e)
    Par défaut
    @CosmoKnacki
    Là, tu forces l'encodage en UTF-8 (?)

    Du coup, si le fichier est DÉJÀ encodé en UTF-8, ça ne fonctionne pas comme voulu (on obtient le résultat de laurentSc).

    C'est pourquoi, dans les codes que j'ai proposés, j'ai utilisé mb_detect_encoding() pour D'ABORD vérifier l'encodage du fichier.
    Je n'ai pas trouvé mieux...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 5
    Dernier message: 13/09/2013, 14h41
  2. Réponses: 2
    Dernier message: 20/02/2012, 09h29
  3. Réponses: 0
    Dernier message: 05/08/2011, 18h53
  4. Réponses: 1
    Dernier message: 08/09/2007, 17h12
  5. Réponses: 5
    Dernier message: 20/02/2007, 06h27

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