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

Shell et commandes GNU Discussion :

[Shell] import CSV dans une base de données.


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 33
    Points : 16
    Points
    16
    Par défaut [Shell] import CSV dans une base de données.
    Bonjour,

    J'essaye d'importer un fichier CSV dont les champs sont séparés par des ";" dans une base de donnée postgreSQL.

    Le probleme est que je ne vois pas trop comment réussir à saisir ligne par ligne les données de mon fichier pour ensuite injecter les données tout en respectant la Cast.

    Donc, mon fichier CSV comporte : ID; Nom; Jour; N°jour; Mois; Taille

    et je dois importer ces données dans la table qui contient les colonnes suivantes ( dans l'ordre) : ID (entier), Nom (varchar), Date (timestamp), Taille (entier).

    C'est un vrai casse tête et comme je débute ....

    Merci d'avance.

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 33
    Points : 16
    Points
    16
    Par défaut
    Pas d'idée ?

    J'ai parcouru le net et je suis tombé sur une source comme ceci :
    Je n'y ai rien changé si ce n'est le nom du fichier et le nom de mes variables, mais apparement il calle apres le "for".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    I=0
    for line in `fichier.csv`
    do
      while read ligne
      do
        VAR3=`echo $ligne | awk -F ";" '{ print $3}'`
        VAR4=`echo $ligne | awk -F ";" '{ print $4}'`
        if [ "$I" -ne 0 ]; then
          psql -U postgres DATABASE -c "INSERT INTO Table (ID, NOM) VALUES (CAST ('$3') AS INTEGER, $4)"
        fi 
      I=`expr I+1`
      done
    done

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 81
    Points : 56
    Points
    56
    Par défaut
    essaie ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    cat fichier.cvs|while read line; do
        VAR3=`echo $ligne | awk -F ";" '{ print $3}'`
        VAR4=`echo $ligne | awk -F ";" '{ print $4}'`
        if [ "$I" -ne 0 ]; 
        then
            psql -U postgres DATABASE -c "INSERT INTO Table (ID, NOM) VALUES (CAST ('$3') AS INTEGER, $4)"
        fi 
        I=`expr I+1`
    done
    je n'ai pas testé à l'intérieur du while mais déjà tu devrais pouvoir rentrer dedans si c'est ça qui n'allait pas.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 33
    Points : 16
    Points
    16
    Par défaut
    il passe bien dans la boucle, mais les variables ne sont pas remplies correctement .

    Si je fais un

    juste apres son initialisation par exemple, il m'affiche une succession de 'blanc' alterner avec une erreur 'invalid input syntax for integer' comme résultat.
    Bien entendu ma base reste vide ^^.

    Comment faire pour que la variable s'initialise correctement ? Ca m'arrive souvent quand j'utilise les variables $1 $2 $3 .... elles ont une durée de vie tres limitée -_-'.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 33
    Points : 16
    Points
    16
    Par défaut
    non c'est bon j'ai trouvé. Probleme de syntaxe, je vais aller m'acheter des lunettes .

    Merci ca marche .

  6. #6
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 79
    Points : 54
    Points
    54
    Par défaut
    Bonjour,

    Désolé de déterrer ce message, mais j'ai à peu de chose près le même problème qu'AngeDéchu.
    J'essaye, via KSH, de lire un fichier CSV (séprateur : ";") et d'associer chaque ligne du fichier à une ligne d'un tableau (cf. exemple ci-dessous).

    Fichier toto.csv :
    blablabla;01/01/2012
    blablabli;01/01/2012
    blablablu;01/01/2012
    blablablo;01/01/2012

    J'aimerai que ce fichier soit donc lu, ligne par ligne, et que les données soient insérées dans un tableau à 2 dimensions.

    Etant débutant en KSH, je me suis totalement inspiré du code d'AngeDéchu comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/bin/ksh
    #Insertion des champs fichier et date dans un tableau
     
    cat toto.csv|while read line; do
        VAR1=`echo $ligne | awk -F ";" '{print $1}'`
        VAR2=`echo $ligne | awk -F ";" '{print $2}'`
        I=`expr I+1`
    done
     
    exit 0
    Dans un premier temps, afin de savoir si mon fichier est bien lu, je désire afficher les valeurs que le awk lit. Cependant, rien ne s'affiche

    Sauriez-vous me dire pourquoi?

    D'avance, merci!

  7. #7
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 247
    Points : 473
    Points
    473
    Billets dans le blog
    1
    Par défaut
    Le resultats sont affectés aux variables $VAR1 et $VAR2 qui ne sont pas affichées.
    Il faut enlever
    VAR1= et VAR2=
    ou
    rajouter leur affichage dans la boucle ( echo $VAR1 $VAR2 par exemple )

  8. #8
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  9. #9
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 79
    Points : 54
    Points
    54
    Par défaut
    Bonjour Jean.Cri1,

    Merci d'avoir pris le temps de me répondre. Comme tu le vois, je suis loin d'être un expert (mon erreur était pourtant évidente).

    Pour information, j'ai également trouvé la méthode suivante (et qui fonctionne parfaitement).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    inputfile="./toto.csv"
     
    OLDIFS="$IFS"
    IFS=";"
    while read NAME VALUES ; do
       echo $NAME
       echo $VALUES
    done < "$inputfile"
    IFS="$OLDIFS"
     
    exit 0
    Comment dois-je procéder pour affecter mes variables NAMES et VALUES dans un tableau? Entre le While et le done, ça je pense que oui, mais NAMES et VALUES ne sont-elles pas des tableaux?

  10. #10
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 79
    Points : 54
    Points
    54
    Par défaut
    Bonjour N_BaH,

    Effectivement j'étais déjà tombé sur votre message, mais d'autres recherches me poussaient vers le AWK, et donc je ne suis pas revenu aux bases!

    Merci tout de même, je pense utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while IFS=';' read -a Array
    do echo "${Arrray[@]}"
    done < fichier.csv
    EDIT : Cher N_BaH, j'ai un petit soucis :
    read: 0403-010 Option non valide pour cette commande.
    Il apparaît que le -a n'est pas le bienvenu (je ne suis pas en KSH, mais SH).

    Dois-je finalement m’atteler au AWK?

    Cordialement!

  11. #11
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    SH ne peut pas utiliser les tableaux.

    pourquoi penses-tu avoir besoin d'un tableau ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  12. #12
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 79
    Points : 54
    Points
    54
    Par défaut
    Et bien je pensais stocker les lignes de mon fichier CSV dans un tableau, puis boucler sur les lignes de ce denier afin d'effectuer quelques opérations.
    En écrivant celà je me rentre compte que je peux effectuer ces opérations directement dans mon while...mais je suis habitué à stocker mes sources avant de les exploiter, d'où mon erreur.

    Merci en tout cas pour ton attention.

    Cordialement.

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

Discussions similaires

  1. [AC-2010] Importer un fichier csv dans une base de données existante ACCESS
    Par rossy1990 dans le forum Access
    Réponses: 2
    Dernier message: 16/04/2014, 02h38
  2. [MySQL] Import de fichiers CSV dans une base de données
    Par damdam00 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 17/07/2010, 15h05
  3. [MySQL] Importation d'un csv dans une base de données.
    Par Hotei dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 09/04/2010, 20h51
  4. [PHP 5.2] Importation fichier CSV dans une base de données
    Par gtraxx dans le forum Langage
    Réponses: 10
    Dernier message: 21/02/2010, 15h16
  5. [MySQL] Importer les données d'un fichier CSV dans une base de données
    Par joueur dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 12/11/2008, 11h59

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