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. #21
    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 effectivement, c'est mieux là.
    En plus j'avais un warning sur le gawk qui supprime les millisecondes avec l'autre version.


    Merci


    Voici mon script final:

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    #!/bin/sh
     
    touch log.log
    echo "$(date +%X) ### Debut programme ###" >> log.log
     
    rm tmp.txt
    echo "$(date +%X) - Debut formattage fichiers a traiter" >> log.log
    ls ./*T_*.txt | while read fic
    do
    	#on enleve les espaces du nom du fichier et on remplace par _
    	if [ `echo "$fic"|grep ' '|wc -l` -ne 0 ]
    	then
    		mv "$fic" `echo "$fic" | sed -r 's/\s+/_/g'`
    		nomFic=`echo "$fic" | sed -r 's/\s+/_/g'`
    		#on remplace les tabulations par une virgule et on met chaque valeur entre simple quote
    		sed -i "s/^/'/; s/\t/','/g; s/$/'/" $nomFic 
    	fi
    done
    echo "$(date +%X) - Fin formattage fichiers a traiter" >> log.log
     
    echo "$(date +%X) - Debut generation .SQL" >> log.log
    find . -type f -name "*T_*.txt" | while read fichier
    do
     
    	nomTable=$(echo "$fichier" | gawk -F ',' '{sub("Reprise_", "", $1);gsub("[^A-Z_]","", $1);print table=$1}')
    	flux=$(echo "$fichier" | gawk -F ',' '{sub("^_", "", $2);print flux=$2}')
    	colonnes=""
    	ts=$(date +%s)
    	echo "$(date +%X) - 	Debut traitement ==> $fichier" >> log.log
    	i=0
    	echo "fichier en cours =>"$fichier
    	nbLignes=$(sed -n '$=' $fichier)
     
    	echo "nb=>"$nbLignes
    	j=0
    	while read ligne
    	do
     
    		if test $j = 10000
    		then
    		ts=$(date +%s)
    			touch ${nomTable}_${flux}_${ts}_$i.sql
    			cat tmp.txt >> ${nomTable}_${flux}_${ts}_$i.sql
    			rm tmp.txt
    			touch tmp.txt
     
    			j=0	
     
    		fi
    		if test $i = 0
    		then
    			colonnes=$(echo "$ligne" | gawk '{gsub("\047", "", $0);print colonnes=$0}')
    		else			
    			#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				
    		fi
     
    		i=$(($i+1))
    		j=$(($j+1))
     
    	done < $fichier
    	cat tmp.txt >> ${nomTable}_${flux}_${ts}_$i.sql
    	rm tmp.txt
    	echo "$(date +%X) - 	Fin traitement ==> $fichier" >> log.log
    	mv *.sql sql/
    done
    echo "$(date +%X) - Fin generation .SQL" >> log.log
     
    echo "$(date +%X) - Debut creation script d'appel global" >> log.log
    touch sql/globalScript.sql
    find sql/*.sql -type f | while read script
    do
    	echo "@${script}" >> sql/globalScript.sql
    done
    mv sql/globalScript.sql globalScript.sql 
    echo "$(date +%X) - Fin creation script d'appel global" >> log.log
     
     
     
    # sqlplus /nolog
    # connect user/pass
    # @globalScript.sql
    # exit

    Je le trouve un peu lent sur les gros fichiers mais sinon ca va, il fait bien son boulot:
    - formatter les fichiers en entrée
    - les parcourir et générer les scripts d'insertion .sql => 10.000 insert par fichier max
    - jouer les fichiers via sqlplus ( faut encore que je récup les logs oracle)

  2. #22
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par erox44 Voir le message
    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?
    Oui. Je sais pourquoi.
    C'est parce que tu n'as pas respecté la règle que je préconise habituellement:
    toujours entourer les variables de double-quotes (sauf si raison valable bien comprise!)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ echo "$line" | od -c
    0000000    -   9   6   5   3   4   7   4   9   6   7   0   0   0   0  \t
    0000020   \t   0   4   9   6   7   Z  \t   1  \t   B  \t  \t  \n    
     
    $ echo $line | od -c
    0000000    -   9   6   5   3   4   7   4   9   6   7   0   0   0   0    
    0000020    0   4   9   6   7   Z       1       B  \n
    CQFD

  3. #23
    Invité
    Invité(e)
    Par défaut
    Tu as un peu de retard sur disedorgue
    Citation Envoyé par disedorgue Voir le message
    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

  4. #24
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par ecatomb Voir le message
    Tu as un peu de retard sur disedorgue
    C'est pas faux!!!
    J'avais pô bien lu les réponses

  5. #25
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 342
    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 342
    Par défaut
    Citation Envoyé par erox44 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #!/bin/sh
     
    touch log.log
    echo "$(date +%X) ### Debut programme ###" >> log.log
    Le touch log.log ici est inutile, puisque le echo ici le fait implicitement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    rm tmp.txt
    echo "$(date +%X) - Debut formattage fichiers a traiter" >> log.log
    ls ./*T_*.txt | while read fic
    do
    	#on enleve les espaces du nom du fichier et on remplace par _
    	if [ `echo "$fic"|grep ' '|wc -l` -ne 0 ]
    A la place du ls, pourquoi pas un find ?
    une version plus courte pour ton if
    if $(echo "$fic" | grep -q ' ')le wc -l n'est pas util, grep retourne (on dira) false s'il ne trouve pas le pattern
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	then
    		mv "$fic" `echo "$fic" | sed -r 's/\s+/_/g'`
    		nomFic=`echo "$fic" | sed -r 's/\s+/_/g'`
    		#on remplace les tabulations par une virgule et on met chaque valeur entre simple quote
    		sed -i "s/^/'/; s/\t/','/g; s/$/'/" $nomFic 
    	fi
    done
    ici, il suffirait de définir nomFic avant de faire le mv, comme ça tu économiserais un sed
    J'ai pas regardé en détail le reste du code, mais à priori tu fais plusieurs boucles sur la même base de fichiers, tu devrais donc pouvoir le faire en une seule boucle

  6. #26
    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,
    effectivement, j'ai regroupé la premier boucle "ls" dans la 2e.

    Après, niveau perf, comme il arrive que le fichier à parcourir fasse 1.000.000 ou plus de lignes, ce sera forcement un peu long :p

  7. #27
    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
    Arf, je viens de voir que certaines insert sont foireux vu que des chaines contiennent des single quote :/

    Un coup de main pour re-traiter une nouvelle fois la chaine ?

  8. #28
    Invité
    Invité(e)
    Par défaut
    Le remplacer par le code html correspondant si ce sera afficher sur une page php ?

    (sans le espace entre le & et le #)
    echo "123'456" | sed "s/'/\& #130;/g"
    123& #130;456

  9. #29
    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
    J'ai créé un nouveau topic pour ce traitement du coup.

    Mais non, pas affiché, ce sont des données métier qui vont être utilisées en tableau excel ou autre après

  10. #30
    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
    De retour,
    mon script fonctionne très bien quand je le teste via Cygwin, mais là où c'est moins cool, c'est quand je le lance sur le serveur Solaris, les traitements ne sont plus les mêmes

    n'est plus reconnu
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed "s/'/''/g; s/\t/','/g" $nomFic
    le \t n'est pas trouvé.

    Et plus bas dans le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ligne4=$(echo "$ligne3" | sed "s#'[0-9]\{1,2\}/[0-9]\{1,2\}/[0-9]\{4\} [0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}'#to_date(\0 ,'dd/mm/yyyy hh24:mi:ss')#g")
    la partie \0 me renvoie non plus la chaine traitée, mais tout simplement la chaine "0"

    Pour qu'une partie passe j'ai modifié :
    en

  11. #31
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 134
    Par défaut
    La version de sed sur Solaris n'est pas GNU (comme Cygwin) mais POSIX
    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.

  12. #32
    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 il y a un impact sur le sed en lui même ainsi que les regex d'après Google

    Ce qui m'étonne là c'est que, je balances ces commandes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e "s/'/''/g; s/	/','/g" $nomFic > tempo.txt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    colonnes=$(echo "$ligne" | nawk '{gsub("\047", "", $0);print colonnes=$0}')
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    			#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")
    			ligne4=$(echo "$ligne3" | sed "s#'[0-9]\{1,2\}/[0-9]\{1,2\}/[0-9]\{4\} [0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}'#to_date(\0 ,'dd/mm/yyyy hh24:mi:ss')#g")
    			ligne5="'${ligne4}'"
     
    			echo "insert into ${nomTable} (${colonnes}) values ( ${ligne5}, to_date('${dateTechnique}', 'dd/mm/yyyy hh24:mi:ss') );" >> tmp.txt
    Je concatène le tout, et pourtant , il me rajoute des retour chariots à gogo, et si impossible de les virer :/

  13. #33
    Invité
    Invité(e)
    Par défaut
    Passe un coup de dos2unix sur tes fichiers avant de lancer le programme. Ca va enlever le caractère de retour chariot en trop (celui de windows)

  14. #34
    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
    Hm je viens de lancer la commande sur mes fichiers avant de les transferer sur mon serveur, j'ai relancé mon script:

    les fichiers générés sont maintenant sans les retours chariot

    par contre la ligne suivante semble encore poser soucis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ligne4=$(echo "$ligne3" | sed "s#'[0-9]\{1,2\}/[0-9]\{1,2\}/[0-9]\{4\} [0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}'#to_date(\0 ,'dd/mm/yyyy hh24:mi:ss')#g")
    Dans mon fichier généré au lieu du param \0 j'ai la chaine "0"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ..., to_date(0 ,'dd/mm/yyyy hh24:mi:ss', ...
    Pourtant la ligne suivante fonctionne nickel :
    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 \2,'dd/mm/yyyy hh24:mi:ss TZH:TZM')#g")

    Vous auriez une idée?

  15. #35
    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, après tests, cette version fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ligne4=$(echo "$ligne3" |sed "s#\('[0-9]\{1,2\}/[0-9]\{1,2\}/[0-9]\{4\} [0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}\)'#to_date\(\1' ,'dd/mm/yyyy hh24:mi:ss'\)#g")
    Je relance une génération globale pour voir, w8 & see...

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

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