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

PHP & Base de données Discussion :

Comparer ligne csv et ligne table SQL


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 8
    Par défaut Comparer ligne csv et ligne table SQL
    Bonjour,

    J'aurai besoin d'aide ou de pistes pour un problème à priori simple mais je bloque pas mal dessus. (Je suis encore débutant en php/mysql)
    Je dois remplir une table de ma base de données sous MySQL en important les données d'un fichier .csv (c'est OK, j'ai réussi) mais avant de faire cet import, il me faut comparer les données de ma première ligne, deuxième, troisième etc ... jusqu'à la fin du fichier csv (qui correspond aux noms des colonnes qu'il doit y avoir dans ma table) avec le nom des colonnes de ma table sous MySQL afin de vérifier que nous avons un bon ordonnancement et que nous mettons les bonnes données aux bons endroits.

    Mais voilà je patauge, je n'arrive pas à récupérer une par une les données de ma ligne1, ligne 2, ligne 3 etc ... puis la comparer à la colonne adéquate de ma table.

    Voici ce que je voudrais :

    J'ai une requête préparée :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
     $bdd -> prepare ('SELECT fld_nom FROM td_tables WHERE fld_nom = ?')

    Ce bout de code ne doit sûrement pas marcher mais c'est un exemple de ce que je voudrais ...
    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
    while($champ = fgetcsv($fic,$taille,$delimiteur)){
    $ref_nom = $champ[1]; //ligne de la colonne "nom" du fichier csv
    $req_compare_csv -> execute([$_POST['table']]);
     
    //echo $result['fld_nom'];
     
    while ($result = $req_compare_csv->fetch()){
                    $refdb=$result['fld_nom'];
    //Si ligne 1 BDD == ligne 1 CSV alors "OK" et on passe à la ligne 2 : Si ligne 2 BDD == ligne 2 CSV alors "OK" etc ... 
                        if ($refdb==$ref_nom){
                        echo "OK";
                        }
                        else {
                        echo "NOK";
                        }
                 }
    }
    fclose ($fic);
    EDIT : En fait en me relisant je ne suis pas très clair, en résumé je voudrais comparer seulement une colonne "nom" de mon fichier CSV et la colonne "nom" de ma table SQL.
    Exemple :
    Dans ma table Animal : Colonne Nom_Animal :
    Chien, Chat, Lapin,Cheval
    Dans mon fichier CSV : Colonne Nom_Animal :
    Chien, fourmi, serpent,dauphin

    Je veux simplement comparer toutes les lignes avant d'importer mes données, du coup : Chien et Chien "OK", on continue -> Chat et fourmi "NOK" on arrête la lecture et on resélectionne un autre fichier où les noms doivent être identiques à la colonne nom de la table SQL.
    (J'espère avoir été assez clair... Sinon n'hésitez pas à me poser des questions !)
    Auriez-vous des pistes ? Merci d'avance

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 73
    Par défaut
    Ce n'est pas très clair pour moi, en tout cas...

    1. Quelle est la volumétrie ? Le traitement ne sera pas forcément le même si tu as trois éléments que si tu en as 42 millions.

    2. Mettons-nous d'accord :
    - Le fichier CSV, tu veux l'utiliser pour faire un INSERT massif ou c'est pour un UPDATE ?
    - Que compares-tu au juste ?
    - Une table d'une base de données n'est pas "triée". On ne peut donc pas comparer une table et un CSV ligne à ligne.
    A la limite, on peut comparer le résultat d'une requête triée et un CSV...

    J'ai compris ça :
    Table ANIMAUX :
    Nom_Animal Information_Animal
    Chien fait ouaf
    Chat feignant
    Cheval fait des lasagnes
    Fichier CSV :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Chien;fait ouaf
    Fourmi;croonde
    Chat;fainéant
    Et tu veux que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SI (un animal présent dans le CSV est absent de la TABLE) OU (un animal présent dans la TABLE est absent du CSV)
       ERREUR
    SINON
       Traitement

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 8
    Par défaut
    Bonjour !

    Le fichier CSV est pour un UPDATE dans la base de données.

    > Une table d'une base de données n'est pas "triée". On ne peut donc pas comparer une table et un CSV ligne à ligne.
    A la limite, on peut comparer le résultat d'une requête triée et un CSV...

    Oui pardon, voici ma vraie requête :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     $req_compare_csv = $bdd -> prepare ('
    							SELECT fld_nom 
    							FROM td_fields 
    							WHERE fld_tbl_id = ( 
    							SELECT tbl_id 
    							FROM td_tables 
    							WHERE tbl_nom = ? ) 
    							ORDER BY fld_ordre
    							');

    Donc oui ma table est triée et j'aimerai comparer 1 à 1 les résultats de la colonne "fld_nom" à la colonne "nom" de mon fichier CSV également trié.
    Donc ce que je voudrais est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (colonne_fldnomSQL != colonneNomCSV){
    erreur }
    else {
    //Les colonnes sont égales on importe les données
    }
    EDIT : En fait j'ai plusieurs table de la même famille dans lesquelles on retrouve cette fameuse colonne "nom". Dans cette colonne il arrive parfois que le nom réapparaisse dans certaines tables et à la même position.
    Par exemple :
    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
    Table_Animal 1 : 
    (position, nom)
    1;Chien
    2;Chat
    3;Lapin
     
    Table_Animal2 :
    (position,nom)
    1;Chien
    2;Chat
    3;Cheval
     
    Fichier_CSV :
    (position,nom)
    1;Chien
    2;Chat
    3;Cheval
    Je veux simplement vérifier que le fichier CSV appartienne bien à la table_animal2.

    Merci d'avance pour la lecture de mon problème !

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 73
    Par défaut
    Il faut qu'il y ait exactement la même chose de chaque côté, quoi...

    Dans ce cas, la solution la plus simple est de stocker le résultat de ta requête dans un tableau.
    Ensuite tu lis chaque ligne de ton CSV et tu compares avec l'élément du tableau. Et tu peux t'arrêter à la première erreur, histoire d'optimiser un peu...
    En gros :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    TANT QUE LitLigneCSV
       if ResultatSQL[i] != Champ1
          return FALSE
       i = i + 1
    FIN TQ
    return TRUE

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 8
    Par défaut
    @MacGawel : Merci beaucoup ! Ca marche
    Par contre dans le return FALSE j'aimerai bien écrire un petit mot du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if($tableau_nom_SQL[$i] !== $champ[1]){
    							echo "Attention votre fichier ne correspond pas à la table demandée"
    						}$i++;
    Mais évidemment vu que c'est dans le "tant que" ça m'envoie en boucle le message. Et comme le "else" dans une boucle while ne fonctionne pas ... Une idée ?
    Merci encore ! =)

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 73
    Par défaut
    Je l'ai écrit comme une fonction qui renvoie TRUE ou FALSE. Derrière, tu peux traiter le retour et afficher ton message suivant le résultat...

    Si tu veux "juste" afficher ton message et sortir de ta boucle, utilise break.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 27/08/2010, 07h29
  2. [phpMyAdmin] Importer un csv dans une table SQL
    Par Mohican69 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 4
    Dernier message: 17/08/2010, 13h07
  3. exportation de d'un fichier csv vers une table sql
    Par sanounatibibt dans le forum VB.NET
    Réponses: 3
    Dernier message: 02/01/2010, 16h59
  4. Réponses: 4
    Dernier message: 05/09/2008, 11h03
  5. Réponses: 2
    Dernier message: 04/04/2008, 18h58

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