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 :

Génération script SQL


Sujet :

Shell et commandes GNU

  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2007
    Messages : 500
    Par défaut Génération script SQL
    Hello,
    j'ai en entrée, un fichier de la forme suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    COL1	COL2	COL3	COL4	COL5
    -96534749670000		04967Z	1	B		
    -97024749650000		04965Z	1	B
    Et je dois générer un script SQL pour insérer ces données.

    Le problème ici, c'est pour :

    • encadrer chaque valeur par des simples côtes
    • détecter la présence d'espace ou tabulation entre les valeurs pour déceler les colonnes "NULL" (ici la COL2 par exemple)



    Actuellement j'essaye avec quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    valeurs=$(echo $ligne | gawk '{gsub(" ", ",", $0);print valeurs=$0}')
    Sauf que là, il remplace n'importe quel espace par une virgule, du coup, la valeur vide de ma col2 passe à la trappe


    Il faudrait également que j'arrive à détecter pour chaque valeur si elle est de la forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    02/10/2012 04:44:27.000000 +00:00
    Pour la remplacer par un TO_DATE()




    Quelqu'un pour éclairer ma lanterne?

  2. #2
    Invité
    Invité(e)
    Par défaut
    Quelle colonne peut être une date?
    Pour cette partie je n'ai pas d'idée pour le moment.

    Pour le reste voici une solution avec sed (c'est sans doute plus simple avec awk):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed "s/^/'/; s/\t/','/g; s/$/'/" fichier
    Chaque colonne sera encadrée par des simples quote.
    Les colonnes seront séparées par une virgule.

    Il reste à voir si c'est toujours séparé par des tabulations ou non.
    Et aussi s'il peut y en avoir dans le nom.

    Il faudrait aussi nous donner un exemple avec des espaces.

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2007
    Messages : 500
    Par défaut
    Salut,

    si je fais un echo de cette commande, en effet, c'est pile ce que je veux.
    Mais si j'essaye cette commande sur une ligne, ca me met juste un simple cote en début et fin de ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    val=$(echo $ligne |sed "s/^/'/; s/\t/','/g; s/$/'/")
    Tu sais pourquoi?

    Pour les dates, justement c'est le problème, ça peut être n'importe laquelle suivant le fichier que je parse.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Il manquait un espace après la redirection. Si cela ne fonctionne toujours pas essaie avec la deuxième ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    val=$(echo $ligne | sed "s/^/'/; s/\t/','/g; s/$/'/")
    val=`echo $ligne | sed "s/^/'/; s/\t/','/g; s/$/'/"`

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2007
    Messages : 500
    Par défaut
    Re,
    même résultat avec les deux lignes : juste une cote en début et fin de ligne.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Peux-tu regarder si la ligne contient bien des tabulations?
    C'est peut être simplement des espaces contrairement à l'exemple que tu as mis plus haut.

  7. #7
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2007
    Messages : 500
    Par défaut
    Il y a un truc bizarre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    valeurs=$(echo $ligne | gawk '{gsub(" ", ",", $0);print valeurs=$0}')
    Si je fais un echo de ma ligne, et ensuite un echo du résultats de la commande ci-dessus, c'est comme si il ne détectait pas bien les tabulations.

    Là, il y a beau avoir 15 espaces entre les valeurs, il ne me met qu'une seule virgule.

    Au pire, s'il est possible de remplacer directement le contenu du fichier via le sed, pourquoi pas.


    Je te joint un fichier
    Fichiers attachés Fichiers attachés

  8. #8
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2007
    Messages : 500
    Par défaut
    Bon, j'ai trouvé une solution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	sed "s/^/'/; s/\t/','/g; s/$/'/" $fichier > test.txt
    	cat test.txt > $fichier
    Ca fera l'affaire :p

    Pour les dates, je vais essayer de les détecter via une regex à voir ce que ca donne...


    Merci en tout cas.

  9. #9
    Invité
    Invité(e)
    Par défaut
    "sed -i" pour remplacer le fichier par le résultat du sed

  10. #10
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 341
    Par défaut
    Citation Envoyé par erox44 Voir le message
    Salut,

    si je fais un echo de cette commande, en effet, c'est pile ce que je veux.
    Mais si j'essaye cette commande sur une ligne, ca me met juste un simple cote en début et fin de ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    val=$(echo $ligne |sed "s/^/'/; s/\t/','/g; s/$/'/")
    Tu sais pourquoi?
    Bonjour,

    Juste pour la petite explication, il faut écrire echo "$ligne" pour que le echo conserve le format de $ligne.
    C'est le même principe que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ echo  titi      tata      toto
    titi tata toto
    $ echo "titi      tata      toto"
    titi      tata      toto

  11. #11
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2007
    Messages : 500
    Par défaut
    Ok merci de l'info

  12. #12
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2007
    Messages : 500
    Par défaut
    Pour la partie traitement des dates,
    j'ai des données de la forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '03/10/2012 01:26:18.000000 +00:00'
    C'est quoi le moyen le plus simple de transformer cette chaine en l'encadrant par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    to_timestamp_tz('$donnee','dd-mm-yyyy hh24:mi:ss TZH:TZM')
    La regex devrait ressembler à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [0-9]{1,2}\/[0-9]{1,2}\/[0-9]{4} [0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{6} \+[0-9]{2}:[0-9]{2}

  13. #13
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2007
    Messages : 500
    Par défaut
    Pour l'instant, sur une ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '-96534746220000','','04622_20121002T044427Z','1','A01','','A02','02/10/2012 04:44:27.000000 +00:00','A02','A','','','','02/10/2012 04:44:23.000000 +00:00','02/10/2012 01:30:00.000000 +00:00','03/10/2012 22:00:00.000000 +00:00','02/10/2012 01:30:00.000000 +00:00','03/10/2012 22:00:00.000000 +00:00','','2012-10-02T04:44:27.0000Z','04622'
    Si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ligne3=$(echo "$ligne" | sed  -r 's#[0-9]{1,2}/[0-9]{1,2}/[0-9]{4} [0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{6} \+[0-9]{2}:[0-9]{2}#toto#g')
    Ma ligne n'est pas modifiée du tout, comme si il ne matchait rien :o

  14. #14
    Invité
    Invité(e)
    Par défaut
    Edit ton ancien message plutôt que de faire des doubles post

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ligne3=$(echo "$ligne" | sed  -r 's#[0-9]{1,2}/[0-9]{1,2}/[0-9]{4} [0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{6} \+[0-9]{2}:[0-9]{2}#toto#g')
    Cela fonctionne bien chez moi. As-tu testé dans le terminal ou dans le programme? Quel shebang utilises-tu dans ton programme?

    Tu peux aussi essayer comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ligne3=$(echo "$ligne" | sed 's#[0-9]\{1,2\}/[0-9]\{1,2\}/[0-9]\{4\} [0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}\.[0-9]\{6\} +[0-9]\{2\}:[0-9]\{2\}#toto#g')

  15. #15
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2007
    Messages : 500
    Par défaut
    Ah, avec la 2e version ça passe

    J'ai plus qu'à essayer d'encadrer la regexp par le to_timestamp :p


    Merci du coup de main.

    EDIT:

    Là où je suis embeté, c'est que je suis sensé modifier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '02/10/2012 09:42:17.000000 +00:00'
    En

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    to_timestamp_tz('02/10/2012 09:42:17.000000 +00:00','yyyy-mm-dd hh24:mi:ss TZH:TZM')
    Mais avec les simple quote dans la regex, le sed apprécie pas trop.
    J'ai essayé en remplacant la ' par \047, ça a pas fonctionné non plus.

  16. #16
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 341
    Par défaut
    Bonjour,

    Pour la commande sed, passe par des double quote au lieu du simple quote:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ echo $XX
    '02/10/2012 09:42:17.000000 +00:00'
    $ echo "$XX" | sed "s/'/quote/g"
    quote02/10/2012 09:42:17.000000 +00:00quote

  17. #17
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ligne3=$(echo "$ligne" | sed "s#\('[0-9]\{1,2\}/[0-9]\{1,2\}/[0-9]\{4\} [0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}\.[0-9]\{6\} +[0-9]\{2\}:[0-9]\{2\}'\)#to_timestamp_tz(\1,'yyyy-mm-dd hh24:mi:ss TZH:TZM')#g")

  18. #18
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2007
    Messages : 500
    Par défaut
    Ok, donc là ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ligne3=$(echo "$ligne" | sed "s#'[0-9]\{1,2\}/[0-9]\{1,2\}/[0-9]\{4\} [0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}\.[0-9]\{6\} +[0-9]\{2\}:[0-9]\{2\}'#to_timestamp_tz('[0-9]\{1,2\}/[0-9]\{1,2\}/[0-9]\{4\} [0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}\.[0-9]\{6\} +[0-9]\{2\}:[0-9]\{2\}','yyyy-mm-dd hh24:mi:ss TZH:TZM'\)#g")
    seul soucis, voici le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    to_timestamp_tz('[0-9]{1,2}/[0-9]{1,2}/[0-9]{4} [0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{6} +[0-9]{2}:[0-9]{2}','yyyy-mm-dd hh24:mi:ss TZH:TZM')
    En gros, ma date initiale n'est pas conservée.



    EDIT:
    Ah c'est bon avec ta version, merci bien à vous deux

  19. #19
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2007
    Messages : 500
    Par défaut
    Si ça intéresse , voici le les commandes finales :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    			# on transforme les timestamp par la fonction oracle TO_TIMESTAMP_TZ()
    			ligne3=$(echo "$ligne" | sed "s#\('[0-9]\{1,2\}/[0-9]\{1,2\}/[0-9]\{4\} [0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}\.[0-9]\{6\} +[0-9]\{2\}:[0-9]\{2\}'\)#to_timestamp_tz(\1,'dd/mm/yyyy hh24:mi:ss TZH:TZM')#g")
    			# on supprime les millisecondes du timestamp 
    			ligne4=$(echo "$ligne3" | grep "[0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}\.[0-9]\{6\}" | gawk '{gsub("\\.[0-9]\\{6\\}","",$0);print ligne4=$0}' )
    			echo "insert into ${nomTable} ($colonnes) values ( ${ligne4} );" >> tmp.txt

  20. #20
    Invité
    Invité(e)
    Par défaut
    Tu aurais du prévenir que tu ne voulais pas les millisecondes :p

    Cette version sera mieux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    			# on transforme les timestamp par la fonction oracle TO_TIMESTAMP_TZ()
    			ligne3=$(echo "$ligne" | sed "s#\('[0-9]\{1,2\}/[0-9]\{1,2\}/[0-9]\{4\} [0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}\)\.[0-9]\{6\} \(+[0-9]\{2\}:[0-9]\{2\}'\)#to_timestamp_tz(\1 \2,'dd/mm/yyyy hh24:mi:ss TZH:TZM')#g")
    			echo "insert into ${nomTable} ($colonnes) values ( ${ligne3} );" >> tmp.txt

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. génération script sql
    Par zoheir13 dans le forum Firebird
    Réponses: 2
    Dernier message: 26/12/2010, 10h41
  2. Génération automatique de script SQL
    Par Prjprj dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 07/11/2007, 15h35
  3. Power AMC, génération script SQL
    Par davasm dans le forum PowerAMC
    Réponses: 1
    Dernier message: 24/05/2006, 16h18
  4. [PAMC]génération d'un mcd à partir d'un script sql
    Par jounaidi dans le forum Sybase
    Réponses: 2
    Dernier message: 27/03/2006, 17h43
  5. Génération de script SQL avec les données
    Par borgfabr dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 05/03/2004, 13h57

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