Phpmyadmin Import CSV avec controle d'entrée

Résolu
Bonjour,

Voila je souhaiterais faire un script pour importer ma feuille csv

les premiers test d'import fonctionne bien

mon souci actuel et que :

le fichier csv comprend à l'instant t ceux-ci :
"2009-07-15";"15:22:90";"titi"

cependant à l'instant t2 il est comme ceux-ci :
"2009-07-15";"15:22:09";"titi"
"2009-07-15";"15:32:11";"tata"

cependant à l'instant t3 il est comme ceux-ci :
"2009-07-15";"15:22:09";"dors";"titi"
"2009-07-15";"15:32:11";"mange";"tata"
"2009-07-16";"17:32:11";"dors";"titi"

et je souhaiterais que mon fichier l'hors de l'import ne m'écrive pas deux fois la même ligne ?
qu'il y est en somme une vérification des entrés précédente avant l'ajout

Est ce possible ??
Configuration: Change en permanence

25 réponses

Résumé de la discussion

Le problème central est d'importer un fichier CSV sans dupliquer les lignes déjà présentes dans la base, en vérifiant les entrées précédentes avant l'ajout lors de chaque import. Des réponses suggèrent d'écrire en fin d'exécution pour tester l'existence avant insertion et de stocker temporairement les écritures, afin d'éviter les doublons dans le fichier final. D'autres proposent de créer une contrainte unique sur la combinaison date, heure et action (et éventuellement l'identifiant) pour empêcher l'apparition de doublons lors des imports successifs. Le fil évoque aussi des difficultés liées au format CSV, notamment des guillemets et des horodatages incohérents, et souligne l'importance d'aligner les colonnes et les types avant l'import.

Bobot (l’IA à votre service)
  1. CSV OK MERCI

    <!-- Cette permet l'exportation des résultats du formulaire en csv -->

    <?php session_start();

    //On récupère les valeurs du formulaire via la session
    $ddate = $_SESSION['$ddate'];
    $dheure = $_SESSION['$dheure'];
    $dminute = $_SESSION['$dminute'];
    $dseconde = $_SESSION['$dseconde'];
    $fdate = $_SESSION['$fdate'];
    $fheure = $_SESSION['$fheure'];
    $fminute = $_SESSION['$fminute'];
    $fseconde = $_SESSION['$fseconde'];

    <!-- etc... -->

    //connexion au serveur MySQL

    $connexion = mysql_connect("@ip","ID","MP");

    //sélection de la BDD

    $base = mysql_selectdb("BDD",$connexion);

    // Titre des colonnes du fichier .CSV ou .XLS le ; est un saut de colone et le slash n un saut de colone

    $fichier = "Coucou;\n";
    $fichier.= "\n";

    // Déclaration du type de contenu

    header("Content-type: application/vnd.ms-excel");

    // Remplacer .csv par .xls pour exporter en .XLS

    header("Content-disposition: attachment; filename=Check_".date("Ymd").".csv");
    print $fichier;
    exit;

    // Crée par Christr

    ?>
    1. Merde, bon Ok.

      Pas de soucis, mais j'aurai preferré que tu y arrives pour au moins comprendre ou ça ne va pas car moi j'avais réussi chez moi, mais à la différence que c'est moi qui avait écrit le CSV dans mon éditeur de texte, donc c'est pour ça que j'avais rajouté le truc sur les fins de lignes.

      Par contre, je pense toujours que si t'as mis les index comme je t'avais mis et que ca faisait tjs le doublon qu'il y a un rapport avec le format de ton fichier CSV... Y a un truc qui cloche dans sa structure ...

      Bon courage pour la suite !

      A++
      1. J'ai beau chercher je ne trouve pas grand chose je pense que je vais faire en sorte que el créateur du csv ce connecte directement sur la base et injecte les variable

        en tout cas Merci pour tout

        ++
        1. Mais merci c'est déjà ça je vais voir et je posterai ma réponse si j'en trouve une lol
          1. Alors la . . . comme ça je vois pas, faudrait que j'ai le truc sous les yeux pour faire moultes tests...

            Je te conseil de bien matté dansla structure du CSV ar moi ca merdait comme ca, genre savoir si tes sauts de lignes c'est bien que du '\n' ou '\r', car moi c'est grace en changeant ça que j'ai réussi a ce qu'il prenne bien toutes mes lignes en comtpes car le soucis c'est qu'il devait mal lire mes lignes donc ca ne correspondait pas avec mes index...

            en tt cas pour moi la solutions est entre la syntaxe de ton csv et les index de ta table après faut tester....

            Désolé de ne pas avoir pu plus t'en dire !
            1. et non désolé

              sa ne rentre que la dernière ligne mais je viens de remarquer un autre problème

              la première fois pour mettre a jour ma table j'ai fait un import csv avec le chemin à parcourir

              mais avec le LOAD DATA INFILE cela pose problème mes champs date et temps reste à 0000-00-00 00:00:00 et le champs id comprend des guillemet en plus

              :$

              Bizard
              1. Bingo !

                Alors, essayes avec

                LOAD DATA INFILE "/var/www/html/titi.csv" REPLACE INTO TABLE balance FIELDS TERMINATED BY ";" LINES TERMINATED BY '\r\n'

                source : http://dev.mysql.com/doc/refman/5.0/fr/load-data.html
                1. Quand tu dis tout le monde, t'as pas mis sur "ref" au moins ?
                  c'est sur tout sauf "ref"
                  1. Je viens d'essayé en maitenan des index a tout le monde et sa marche pas snifffff
                    1. je sais pas si sa peu marcher sachant que la date reste la meme chaque jour et pour tous et le temps revien en continue chaque jour et pour les action et les id et bien c'est a peu près pareil

                      tu crois que sa peu fonctionner ?
                      1. Okay ! Je vois un peu mieux le souci ;)

                        Et un index unique sur "date temps action id" ?
                        1. Dans ma table :

                          ref°°°°°°int(11)°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°No°°°°°°°­°°°°°°auto_increment
                          date°°°°date°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°No°°°°°°°°­°°°°°°°°°°°°°°°°°°°°
                          temps°°time°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°No°°°°°°°°°­°°°°°°°°°°°°°°°°°°°
                          action°°varchar(4)°°°°utf8_general_ci°°°°°°°°°°°°°°No°°°°°°°­°°°°°°°°°°°°°°°°°°°°°
                          id°°°°°°varchar(200)°°utf8_general_ci°°°°°°°°°°°°°°No°°°°°°°­°°°°°°°°°°°°°°°°°°°°°

                          la colone ref est auto incrémenté et clé primaire
                          c'est pourquoi dans mon csv le premier champs est vide et qu'il a juste des guillemet

                          "";"2009-07-15";"15:22:09";"dors";"titi"

                          ensuite ba y a la date temps action id

                          donc si j'envoi mmon csv qui as
                          "";"2009-07-15";"15:22:09";"dors";"titi"
                          en lecture sql sa fera
                          1 2009-07-15 15:22:09 dors titi

                          mais si je renvoi mon csv avec
                          "";"2009-07-15";"15:22:09";"dors";"titi"
                          "";"2009-07-15";"15:28:11";mange";"tata"
                          en lecture sql sa feras
                          1 2009-07-15 15:22:09 dors titi
                          2 2009-07-15 15:22:09 dors titi
                          3 2009-07-15 15:28:11 mange tata

                          donc doublon entre la ligne 1 et 2

                          tu voi ou je veu en venir c'est pas simple à expliquer
                          1. mm dis moi c'est quoi pour toi dans ta BDD les champs qui forme un "enregistrement unique" car la je vois pas bien si c'ets ça la notion de doublons si tu prends en compte la date...
                            J'ai un peu de mal a cerner ton problème :S
                            1. mon souci et que je ne peu crée de champ unique sur le temps car si la date change et que l'action est faite au meme temps sa risque de posé problème non ?

                              et l'action il y en a que 2 possible

                              désolé une erreur dans l'explication du csv je recommence :
                              le fichier csv crée à 15h25 ceux-ci :
                              "";"2009-07-15";"15:22:90";"dors";"titi"

                              à 15h30 ceux-ci :
                              "";"2009-07-15";"15:22:09";"dors";"titi"
                              "";"2009-07-15";"15:28:11";mange";"tata"

                              à 15h35 ceux-ci
                              "";"2009-07-15";"15:22:09";"dors";"titi"
                              "";"2009-07-15";"15:28:11";"mange";"tata"
                              "";"2009-07-16";"17:32:11";"dors";"titi"

                              le fichier csv se nomme tutu.csv oki ?
                              1. Merci, merci, tant que ça, ça va me faire rougir et si j't'aide pas je vais passer pour un bidon :P

                                Si je comprend le truc il faudrait que dans ta BDD tu créé un index UNIQUE sur les 2 champs qui t'interessent : "temps" et "actions". Au moins le replace agirait correctment c'est a dire a faire un update et non un insert lorsqu'il identifie un enregistrement via ce "couple" unique...
                                1. AAAAAA le big boss ça veu dire que le problème va vite avancer

                                  donc voila je t explique j'ai une application qui génère un fichier csv qui est mis à jour toute les 5 minutes

                                  ma table balance

                                  Field°°°°Type°°°°°°°°°Collation°°°°°°°°Attributes°°Null°°Default°°°°Extra°°°°°°°°°°

                                  ref°°°°°°int(11)°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°No°°°°°°°°°°°°°auto_increment
                                  date°°°°date°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°No°°°°°°°°°°°°°°°°°°°°°°°°°°°°
                                  temps°°time°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°No°°°°°°°°°°°°°°°°°°°°°°°°°°°°
                                  action°°varchar(4)°°°°utf8_general_ci°°°°°°°°°°°°°°No°°°°°°°°°°°°°°°°°°°°°°°°°°°°
                                  id°°°°°°varchar(200)°°utf8_general_ci°°°°°°°°°°°°°°No°°°°°°°°°°°°°°°°°°°°°°°°°°°°

                                  "oups y avait un tit problème dans le fichier csv"

                                  le fichier csv crée à 15h25 ceux-ci :
                                  "";"2009-07-15";"15:22:90";"titi"

                                  à 15h30 ceux-ci :
                                  "";"2009-07-15";"15:22:09";"titi"
                                  "";"2009-07-15";"15:28:11";"tata"

                                  à 15h35 ceux-ci
                                  "";"2009-07-15";"15:22:09";"dors";"titi"
                                  "";"2009-07-15";"15:28:11";"mange";"tata"
                                  "";"2009-07-16";"17:32:11";"dors";"titi"

                                  le fichier csv se nomme tutu.csv oki ?

                                  donc moi j'ai une commande que je lance dans sql comme tu ma expliqué
                                  (pour revenir au problème antérieur de l'appli si tu te souvien)

                                  l'orsque que je la lance à 15h30

                                  LOAD DATA INFILE "/var/www/html/tutu.csv" REPLACE INTO TABLE balance FIELDS TERMINATED BY ";";

                                  je n'ai pas de problème

                                  je la relance à 15h40

                                  LOAD DATA INFILE "/var/www/html/titi.csv" REPLACE INTO TABLE balance FIELDS TERMINATED BY ";";

                                  pour mettre à jour ma base de donnée

                                  voici le problème à cause de la référence auto incrémenté la je me retrouve avec des doublons sur la ligne date temps action id
                                  1. Je comprends pas tout, détail un peu plus, l'import tu le fais comment ?
                                    Tu développes avec un laguage en particulier pour le faire ?
                                    et qu'est ce que tu appelles "double" :
                                    "2009-07-15";"15:22:09";"dors";"titi"
                                    "2009-07-15";"15:32:11";"mange";"tata"
                                    "2009-07-16";"17:32:11";"dors";"titi"

                                    Je ne vois pas de doublons, a moins que tu n'importes quele couple "dors" et "titi" et que la date et l'heure c'est l'import qui le génère...

                                    bref dis en + !
                                    • 1
                                    • 2