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 :

CSV vers SQL


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 17
    Points : 16
    Points
    16
    Par défaut CSV vers SQL
    Bonjour,

    Je me permets de poster ici

    Le but de mon script est de récupérer un fichier CSV (on va supposer que les données sont correctes pour l'instant) pour l'insérer, après traitement, dans une base de données SQL.

    Pour l'instant, le fichier est bien uploadé sur le serveur, c'est après que cela se complique.
    Je n'ai pas trop besoin de code (pour l'instant), mais surtout de méthode.
    Le fichier doit être lu, quelques chaines doivent être remplacés comme ceci:
    La colonne 1, c'est la date, est en JJ/MM/AAAA et il faut la faire passer en AA/MM/JJ.

    La colonne 2, il y a des chaines.
    J'aimerais que:
    - si la chaine n'existe pas dans la base (déjà existante) nommée 'client', on créé une ligne.
    - Si elle existe, on la remplace par son ID correspondant.
    (on va faire pareil avec la colonne 3, 4 et 5 mais avec d'autres tables).

    Seulement, je ne sais pas trop comment m'y prendre, dans quel ordre ce serait plus rapide à exécuter ? Quels fonctions utiliser ?

    Merci.

    K.

  2. #2
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 692
    Points : 20 244
    Points
    20 244
    Par défaut
    Pour lire un fichier csv c'est fgetcsv.

    A partir de là il suffit de parser chaque ligne et d'apporter les modification nécessaire avant insertion.
    Dans l'idéal tu feras une requêtes dans ta base pour récupérer toutes les chaines que tu testeras avec ta colonne 2 (histoire de pas fair eune requêtes par ligne).

    La meilleure solution restant quand même d'avoir un csv bien formé à la base et des contraintes sur ta bdd afin de n'avoir qu'un import du csv à faire dans la bdd

    Je me permets de poster ici, car ailleurs on ne sait pas me renseigner
    En même temps sur comment ça marche , c'est connu que tu trouves absolument tout , sauf ce que tu cherches

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 17
    Points : 16
    Points
    16
    Par défaut
    Hello grunk,

    Merci pour ta réponse tout d'abord.
    J'avais commencé avec fopen, ainsi que passer toutes les lignes dans des cases, mais ça s'avère être un bordel monstre, rempli de boucle, et donc non optimisé.
    Oui, je suis depuis 2h sur la page de fgetcsv.
    Mais le soucis, c'est que ça ne renvoi pas sous forme de tableau, si? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $row = 1;
    if (($handle = fopen("$adresse_fichier", "r")) !== FALSE) {
        while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
            $num = count($data);
            echo "<p> $num champs à la ligne $row: <br /></p>\n";
            $row++;
            for ($c=0; $c < $num; $c++) {
                echo $data[$c] . "<br />\n";
            }
        }
        fclose($handle);
    }

  4. #4
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 692
    Points : 20 244
    Points
    20 244
    Par défaut
    L'exemple de la doc est un peu fouilli.

    Plus simplement si on considère le fichier csv suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Col1;Col2;Col3
    valeur1A;valeur1B;valeur1C
    valeur2A;valeur2B;valeur2C
    Pour parser ligne par ligne chaque case suffit de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $h = fopen('monfichier.csv','r');
    while(!feof($h))
    {
        $datas = fgetcsv($h,100,';');
        //$datas[0] donnera successivement Col1 puis valeur1A puis valeur2A
        var_dump($datas);
    }

  5. #5
    Membre éprouvé Avatar de patrickbaras
    Homme Profil pro
    Informaticien (à sa mémère).
    Inscrit en
    Septembre 2010
    Messages
    525
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informaticien (à sa mémère).
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 525
    Points : 1 103
    Points
    1 103
    Par défaut
    La colonne 1, c'est la date, est en JJ/MM/AAAA et il faut la faire passer en AA/MM/JJ.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $dateJJMMAAAA="17/06/2012";
    list($JJ,$MM,$AAAA)=explode("/",$dateJJMMAAAA);
    $dateAAAAMMJ=$AAAA."/".$MM."/".$JJ;
    $dateAAMMJ=substr($AAAA,2,2)."/".$MM."/".$JJ;
     
    var_dump($dateJJMMAAAA);
    var_dump($dateAAAAMMJ);
    var_dump($dateAAMMJ);

  6. #6
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 692
    Points : 20 244
    Points
    20 244
    Par défaut
    Citation Envoyé par patrickbaras Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $dateJJMMAAAA="17/06/2012";
    list($JJ,$MM,$AAAA)=explode("/",$dateJJMMAAAA);
    $dateAAAAMMJ=$AAAA."/".$MM."/".$JJ;
    $dateAAMMJ=substr($AAAA,2,2)."/".$MM."/".$JJ;
     
    var_dump($dateJJMMAAAA);
    var_dump($dateAAAAMMJ);
    var_dump($dateAAMMJ);
    Ou sinon en deux ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $date = DateTime::createFromFormat('j-m-Y', '17/06/2012');
    echo $date->format('y-m-d');

  7. #7
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    sinon ya phpmyadmin qui fait ça nativement (si jamais tu es sous mysql).

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 17
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par gene69 Voir le message
    sinon ya phpmyadmin qui fait ça nativement (si jamais tu es sous mysql).
    <ironie>
    Donnons au visiteur les logs de PHPMyAdmin... ;-)
    </ironie>

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 17
    Points : 16
    Points
    16
    Par défaut
    Au final, je ne sais toujours pas comment procéder.
    Coder, ça va.
    Mais dans quel ordre ?

    ( Sur CCM on me conseille de mettre les éléments dans une table SQL temporaire, mais c'est extrêmement lourd).

  10. #10
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    AMHA, le plus simple, c'est de boucler sur les lignes du CSV et de faire le traitement pour chaque ligne.
    Genre en pseudo-algo :
    Pour chaque ligne du csv $data_ligne :
    	$date = tranformer la date depuis $data_ligne[0]
    	traitement de la colonne 2 ($data_ligne[1])
    	traitement de la colonne 3
    	...
    

Discussions similaires

  1. Import CSV vers SQL en C#
    Par JulienM28 dans le forum ASP.NET
    Réponses: 1
    Dernier message: 09/08/2014, 14h47
  2. Import CSV vers SQL
    Par JulienM28 dans le forum ASP.NET MVC
    Réponses: 0
    Dernier message: 08/08/2014, 16h11
  3. csv vers OpenOffice et sql (gadfly)
    Par noblesse dans le forum Bibliothèques tierces
    Réponses: 1
    Dernier message: 22/09/2011, 17h22
  4. inserer donnée fichier csv vers MS SQL Serveur
    Par bibikool dans le forum Développement
    Réponses: 2
    Dernier message: 11/07/2008, 16h16
  5. [sql][débutant] export de csv vers ftp ?
    Par Christophe93250 dans le forum Access
    Réponses: 1
    Dernier message: 25/06/2006, 14h50

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