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 :

Importer csv ANSI dans BDD utf8


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2019
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Novembre 2019
    Messages : 19
    Points : 15
    Points
    15
    Par défaut Importer csv ANSI dans BDD utf8
    Bonjour,

    Je galère à importer correctement un fichier .csv encodé en ANSI d'après Notepad++ (bon, apparemment c'est pas tout à fait un format d'encodage, mais il semblerait que ce soit de l'ISO-8859-?).
    Ce fichier se compose de 5 colonnes. La deuxième colonne est intitulée "libellé" et contient des caractères accentués :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    N° Compte;Libellé;Débit;Crédit;Solde
    6411000;Salaires, appointements;100,92;;
    6412000;Congés payés;4,6;;
    6413000;Primes et gratifications;1,27;;
    L'importation s'effectue correctement, c'est-à-dire que chaque colonne contient les données au bon format, sauf la colonne "libellé" dont seules les lignes sans caractères accentués sont importées.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    date 	compte_comptable 	libelle 	debit 	credit 	
    2022-09-30 	6411000 	Salaires, appointements 	8394.92 	0.00
    2022-09-30 	6412000 		554.60 	0.00
    2022-09-30 	6413000 	Primes et gratifications 	191.27 	0.00
    La BDD est en utf8mb4_unicode_ci, tout comme la colonne "libellé".
    Voici ce que j'ai testé jusqu'à présent, sans que ça ne change pas un yota de l'importation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $libelle = iconv('ISO-8859-1', 'UTF-8', $sheetData[$i][1]);
    $libelle = utf8_encode($sheetData[$i][1]);
    $libelle = mb_convert_encoding($sheetData[$i][1], 'UTF-8', 'ISO-8859-1');
    Je ne sais pas s'ils vous faut plus d'info; à vous de me dire.

    En tout cas merci d'avance !

    Goo

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 394
    Points : 15 755
    Points
    15 755
    Par défaut
    si vous connaissez l'encodage, essayez la conversion en unicode avant l'analyse avec les fonctions csv.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2019
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Novembre 2019
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par mathieu Voir le message
    si vous connaissez l'encodage, essayez la conversion en unicode avant l'analyse avec les fonctions csv.
    Bonjour mathieu et merci,

    J'ai ajouté la fonction mb_detect_encoding() afin de déterminer précisément l'encodage en cours.
    Résultat : ASCII; donc je vois encore moins pourquoi l'import ne fonctionne pas.
    Puis j'ai ajouté la fonction iconv(), histoire d'être sûr que l'on passe en UTF_8.
    Résultat : toujours ASCII.
    Voici mon code :
    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
        // Spreadsheet
        if(isset($_FILES['file']['name']) && in_array($_FILES['file']['type'], $file_mimes)) {
     
            $arr_file = explode('.', $_FILES['file']['name']);
            $extension = end($arr_file);
     
            if('csv' == $extension) {     
              $reader = new \PhpOffice\PhpSpreadsheet\Reader\Csv();
            } else if('xls' == $extension) {     
              $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xls();
            } else {
              $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
            }
     
            $spreadsheet = $reader->load($_FILES['file']['tmp_name']);
     
            $sheetData = $spreadsheet->getActiveSheet()->toArray();
     
    <div style="margin-left:40px">if (!empty($sheetData)) {
        /// Construction de la date
        // Année
        $var = $sheetData[0][0];
        $extAn = explode(' ', $var);
        $annee = $extAn[4];
        // Dernier jour du mois
        $extDate = $annee.'-'.$_SESSION['mois'].'-01';
        $date = date("Y-m-t", strtotime($extDate));
        /// Importation des données
        for ($i=3; $i<count($sheetData); $i++) {
            if(!empty($sheetData[$i][0])){
                $libelle = iconv('ASCII', 'UTF-8//IGNORE', $sheetData[$i][1]);
                $lib=mb_detect_encoding($libelle);
                $dbt = (!empty($sheetData[$i][2]) ? $sheetData[$i][2] : 0);
                $dbit = str_replace(' ', '', $dbt);
                $debit = str_replace(',', '.', $dbit);
                $cdt = (!empty($sheetData[$i][3]) ? $sheetData[$i][3] : 0);
                $cdit = str_replace(' ', '', $cdt);
                $credit = str_replace(',', '.', $cdit);
     
                $requete = $bdd->prepare("INSERT INTO " . $_SESSION["table"] . " (date, compte_comptable, libelle, debit, credit) VALUES (:date, :cc, :lib, :dbt, :cdt)");
                $requete->execute(array(
                    'date' => $date,
                    'cc' => $sheetData[$i][0],
                    'lib' => $libelle,
                    'dbt' => $debit,
                    'cdt' => $credit
                ));
                echo "<br>";
                echo $lib . "<br>";
                $requete->debugDumpParams();
            }
        }
    }</div>    }
    Voici les données du fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Ecritures comptables - Septembre 2022				
     
    N° Compte	Libellé	Débit	Crédit	Solde
    6411000	Salaires, appointements	8 394,92		
    6412000	Congés payés	554,6		
    6413000	Primes et gratifications	191,27		9 140,79
    6451000	Cotisations à l'URSSAF	232,66
    Voici le résultat du debugDumpParams();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ASCII
    SQL: [112] INSERT INTO 0_social_paie (date, compte_comptable, libelle, debit, credit) VALUES (:date, :cc, :lib, :dbt, :cdt) Sent SQL: [150] INSERT INTO 0_social_paie (date, compte_comptable, libelle, debit, credit) VALUES ('2022-09-30', '6411000', 'Salaires, appointements', '8394.92', '0') Params: 5 Key: Name: [5] :date paramno=-1 name=[5] ":date" is_param=1 param_type=2 Key: Name: [3] :cc paramno=-1 name=[3] ":cc" is_param=1 param_type=2 Key: Name: [4] :lib paramno=-1 name=[4] ":lib" is_param=1 param_type=2 Key: Name: [4] :dbt paramno=-1 name=[4] ":dbt" is_param=1 param_type=2 Key: Name: [4] :cdt paramno=-1 name=[4] ":cdt" is_param=1 param_type=2
    ASCII
    SQL: [112] INSERT INTO 0_social_paie (date, compte_comptable, libelle, debit, credit) VALUES (:date, :cc, :lib, :dbt, :cdt) Sent SQL: [125] INSERT INTO 0_social_paie (date, compte_comptable, libelle, debit, credit) VALUES ('2022-09-30', '6412000', '', '554.6', '0') Params: 5 Key: Name: [5] :date paramno=-1 name=[5] ":date" is_param=1 param_type=2 Key: Name: [3] :cc paramno=-1 name=[3] ":cc" is_param=1 param_type=2 Key: Name: [4] :lib paramno=-1 name=[4] ":lib" is_param=1 param_type=2 Key: Name: [4] :dbt paramno=-1 name=[4] ":dbt" is_param=1 param_type=2 Key: Name: [4] :cdt paramno=-1 name=[4] ":cdt" is_param=1 param_type=2
    ASCII
    SQL: [112] INSERT INTO 0_social_paie (date, compte_comptable, libelle, debit, credit) VALUES (:date, :cc, :lib, :dbt, :cdt) Sent SQL: [150] INSERT INTO 0_social_paie (date, compte_comptable, libelle, debit, credit) VALUES ('2022-09-30', '6413000', 'Primes et gratifications', '191.27', '0') Params: 5 Key: Name: [5] :date paramno=-1 name=[5] ":date" is_param=1 param_type=2 Key: Name: [3] :cc paramno=-1 name=[3] ":cc" is_param=1 param_type=2 Key: Name: [4] :lib paramno=-1 name=[4] ":lib" is_param=1 param_type=2 Key: Name: [4] :dbt paramno=-1 name=[4] ":dbt" is_param=1 param_type=2 Key: Name: [4] :cdt paramno=-1 name=[4] ":cdt" is_param=1 param_type=2
    ASCII
    SQL: [112] INSERT INTO 0_social_paie (date, compte_comptable, libelle, debit, credit) VALUES (:date, :cc, :lib, :dbt, :cdt) Sent SQL: [126] INSERT INTO 0_social_paie (date, compte_comptable, libelle, debit, credit) VALUES ('2022-09-30', '6451000', '', '232.66', '0') Params: 5 Key: Name: [5] :date paramno=-1 name=[5] ":date" is_param=1 param_type=2 Key: Name: [3] :cc paramno=-1 name=[3] ":cc" is_param=1 param_type=2 Key: Name: [4] :lib paramno=-1 name=[4] ":lib" is_param=1 param_type=2 Key: Name: [4] :dbt paramno=-1 name=[4] ":dbt" is_param=1 param_type=2 Key: Name: [4] :cdt paramno=-1 name=[4] ":cdt" is_param=1 param_type=2
    ASCII
    J'utilise la librairie PhpSpreadSheet. J'importe d'autres fichiers (des . csv en UTF_8 qui ne posent aucun problème).
    Peut-être que le soucis vient de là, mais dans ce cas, je n'ai pas les capacités de trouver l'origine du problème (alors le corriger....).

    J'espère que quelqu'un pourra m'aider à trouver une solution, sachant que le fichier ne peut pas être modifié (c'est à dire être passé manuellement en UTF-8 avant import.

    Merci !

Discussions similaires

  1. Import csv dynamique dans access
    Par watred dans le forum VBA Access
    Réponses: 21
    Dernier message: 16/10/2016, 10h38
  2. [MySQL] Importer csv en PHP dans BDD.
    Par stevenP dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 30/01/2014, 10h24
  3. Importer *.csv dans BDD SQL via VB.Net
    Par Ravens dans le forum Windows Forms
    Réponses: 1
    Dernier message: 27/05/2013, 13h23
  4. Import csv 2Go dans MySQL
    Par Yolak dans le forum MySQL
    Réponses: 4
    Dernier message: 29/11/2009, 14h44
  5. [MySQL] importer des données .csv dans BDD MySql
    Par priscillia dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 15/06/2007, 09h40

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