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 :

Création script SQL depuis un fichier CSV


Sujet :

Shell et commandes GNU

  1. #1
    Membre régulier Avatar de Michel38
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2005
    Messages : 218
    Points : 113
    Points
    113
    Par défaut Création script SQL depuis un fichier CSV
    Bonjour à tous,

    Ca fait quelques temps que je cherche déjà.. Je n'arrive pas à faire ce que je veux.
    Ce que j'ai :
    Un fichier CSV avec des valeurs :
    champ1;champ2;champs3;champs4;champs5;champs6

    Et je voudrais en sortie obtenir dans un fichier qui serait comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO MA_TABLE (nom_champ1, nom_champ2, nom_champ3, nom_champ4, nom_champ5, nom_champ6) Values (champ1, champ2, champ3, champ4, champ5, champ6);
    J'ai essayé avec la commande cut, avec awk.. mais visiblement je ne l'écris pas comme il faudrait.
    J'ai oublié d'ajouter que le nom de la table est un paramètre pour lequel je donne une valeur avant la commande à créer. Car en utilisant ce script, je veux en fait utiliser cette commande pour créer plusieurs tables, qui prendront chacune les colonnes nécessaires.
    Quelqu'un aurait une idée pour me débloquer ?

    Merci beaucoup

    Michel

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 802
    Points
    30 802
    Par défaut
    Montre-nous tes scripts, en précisant où tu rencontres un problème.
    Ce sera plus facile pour t'aider à les corriger.

    Il faudrait préciser si nombre de colonnes est fixe, si leur nom apparait en entête du fichier ou si elles sont renseignées en dur dans le script.
    Si le nombre de colonnes est fixe, une simple boucle read suffirait à répondre à la question.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre régulier Avatar de Michel38
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2005
    Messages : 218
    Points : 113
    Points
    113
    Par défaut
    Merci pour la réponse.

    Alors pour l'instant, mon script est comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/bin/bash
    
    if [[ ! -r "$1" ]]; then
           echo "Impossible de lire le fichier CSV : '$1'"
              exit 1
    fi
    TABLE="Table1"
    
    cut -d";" -f1,3,4,5 "$1" | awk -F ";" '{print "INSERT INTO ",$TABLE," values (",$2,",",$1,",",$3,");"}'
    
    
    
    
    Pour l'instant, je n'ai pas mis le nom des colonnes de ma table, mais ce sera en dur dans la commande, car je ne les récupère pas du fichier CSV.
    Le nombre de colonnes est fixe.
    Le cut avec une colonne 2 absente, car je ne vais pas forcément utiliser tous les champs du fichier csv.
    Et pour l'instant, le problème que je n'arrive pas à régler, c'est que je n'arrive pas à utiliser ma variable "TABLE", et au lieu de me mettre le nom de ma table, il me met tous les champs du cut..

    Michel

  4. #4
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Bonjour

    Utiliser cut puis awk est idiot.

    Pour transmettre des variables au script awk, on utilise l'option -v.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F ';' -vtable="$table" '{print "INSERT INTO", table, "VALUES (",$2,",",$1,",",$3,");"}' monfichier.csv
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 802
    Points
    30 802
    Par défaut
    Dans les bonnes pratiques du shell, on conseille de réserver les noms en majuscule aux variables globales.

    Ensuite, à l'intérieur d'une chaine encadrée d'apostrophes une variable du shell n'est pas interprétée par le shell.
    Il faut donc l'extraire de cette chaine pour qu'elle soit bien prise en compte.

    Enfin le cut est superflu ; awk sait très bien faire la même chose. Il suffit de bien calculer la position des champs dont on a besoin.
    Pae ailleurs, la virgule n'est pas un opérateur de concaténation dans awk.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/bin/bash
    Table='Table1'
     
    if [[ ! -r "$1" ]]
    then
      echo "Impossible de lire le fichier CSV : '$1'"
      exit 1
    fi
    awk -F ';' '{print "INSERT INTO "'$Table'" values (" $3 "," $1 "," $4 ");"}' "$1"
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  6. #6
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F ';' '{print "INSERT INTO "'$Table'" values (" $3 "," $1 "," $4 ");"}' "$1"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F ';' '{print "INSERT INTO '"$Table"' values (" $3 "," $1 "," $4 ");"}' "$1"
    La variable a besoin d'être protégé dans le shell et pas besoin d'être protégé dans le awk.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  7. #7
    Membre régulier Avatar de Michel38
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2005
    Messages : 218
    Points : 113
    Points
    113
    Par défaut
    Effectivement, le cut ne sert strictement à rien.
    Je pense que j'avais commencé à chercher avec le cut, et puis je n'arrivais pas à faire ce que je voulais.. Donc j'avais ajouté le awk qui sait tout faire ou presque.

    C'est beaucoup plus simple comme ça et je suis arrivé à mes fins.
    Je vous remercie tous les deux pour votre aide.

    J'ai tout ce qui me faut maintenant.

    A+

    Michel

  8. #8
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    À noter que la plupart des sgbd disposent d'une commande d'importation pour les fichiers csv.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

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

Discussions similaires

  1. [SQL] Executer un script SQL depuis php
    Par sly3333 dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 07/12/2007, 01h33
  2. Réponses: 2
    Dernier message: 23/03/2007, 15h16
  3. exporter données sql dans un fichier csv en java
    Par pinkemma dans le forum JDBC
    Réponses: 2
    Dernier message: 07/03/2007, 09h23
  4. [SQL] Problème exécution sql pour insertion fichier csv
    Par Kyvin dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 20/08/2006, 17h47
  5. Réponses: 3
    Dernier message: 26/04/2006, 11h52

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