Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/06/2008, 20h18   #1
Candidat au titre de Membre du Club
 
Inscription : avril 2007
Messages : 78
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 78
Points : 11
Points : 11
Par défaut problème de séparateurs dans un script sql

bonjour,
j'ai déjà posté ma question dans le forum du langage sql: http://www.developpez.net/forums/sho...=1#post3354007
mais ils y a quelques amis qui m'ont conseillés de poster ici car il ya des vrai experts
Citation:
j'ai généré un script sql à l'aide de l'outil SQLManagerX, et ca dans le but de migrer mes données de H/F vers MySQL.
ce script contient l'ensemble des requêtes qui vont me permettre d'importer les données de H/F vers ma nouvelle base dans Mysql.
lorsque j'exeute le script dans PHPMyAdmin,il me génère une erreur :"parenthèse fermente manquante".
voici une parti du code de mon script:
Code :

INSERT INTO C_Expedition (ExpNum,TransNum,ExpDate,CréeLe,CréePar,ExpCommentaire,MagCode,ExpNumBord)
VALUES (4 , 4 , '20080614' , '20080604' , '' , 'la tournée n'a pas été enregistrée' , 'PRINCIPAL' , 865432 );

donc il considère l'apostrophe du contenu d'un champs de ma table comme étant un séparateur entre les champs de données et non pas une apostrophe.
notre ami pacmann m'a proposé cette solution:
Code :
sed -e 's/\'/\'\'/g' TonFichier.sql |sed -e 's/\(,\ \{1,\}\)\'\'/\1\'/g' |sed -e 's/\'\'\(\ \{1,\},\)/\1\'/g'
mais je sais pas exactement comment la manipuler selon mes besoins?
foulla est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2008, 09h13   #2
Membre émérite
 
Inscription : mai 2004
Messages : 709
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : mai 2004
Messages : 709
Points : 852
Points : 852
Je ne connaissais pas le doublement de quote pour protéger un simple guillemet dans une chaîne mais ça a l'air de fonctionner également. Je l'aurais plutôt échappée plus classiquement avec un backslash.

Pour le doublement du guillemet:
Code :
1
2
3
4
5
# avec l'option -r pour regex étendues
sed -r "s/([A-Z])'([A-Z])/\1''\2/i" ton-fichier
 
# sans regex étendues
sed  "s/\([A-Z]\)'\([A-Z]\)/\1''\2/i" ton-fichier
Pour l'échappement du guillemet:
Code :
1
2
3
4
5
# avec l'option -r pour regex étendues
sed -r "s/([A-Z])'([A-Z])/\1\\\'\2/i" ton-fichier
 
# sans regex étendues
sed  "s/\([A-Z]\)'\([A-Z]\)/\1\\\'\2/i" ton-fichier
[A-Z]'[A-Z] est un motif de regex qui donnera une concordance pour tout caractère alpha suivi d'un guillemet suivi d'un autre caractère alpha.

Les parenthèses ([A-Z]) capturent le caractère et la référence arrière \1 la rappelle dans le groupe de remplacement de sed.

L'option i dans s/motif-a-remplacer/remplacement/i rend le motif de la regex insensible à la casse.
__________________
:q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
:quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
Jabber: ripat at im.apinc.org
ripat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2008, 18h59   #3
Candidat au titre de Membre du Club
 
Inscription : avril 2007
Messages : 78
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 78
Points : 11
Points : 11
salut

ca a marché, merci infiniment, mais j'ai encore 2 autres questions Mr ripat:
1- j'ai pas bien compris le concept ou l'utilité de l'option -r ?
2- la ligne de commande que vous m'avez donnée fonctionne à merveille, mais elle n'apporte pas la modification au fichier traité, parce que quand j'ai exécuté "sed ..." elle m'a affiché le résultat modifié en bas de la fenêtre de Cygwin, par contre le script que je manipule n'a pas été touché, je l'ai ouvert après, mais j'ai remarqué qu'il n' a pas été touché !!
comment je peux apporter les modifications au script sans passé par du copier coller ?
foulla est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2008, 20h13   #4
Membre émérite
 
Inscription : mai 2004
Messages : 709
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : mai 2004
Messages : 709
Points : 852
Points : 852
Citation:
Envoyé par foulla Voir le message
ca a marché, merci infiniment, mais j'ai encore 2 autres questions Mr ripat:
1- j'ai pas bien compris le concept ou l'utilité de l'option -r ?
Globalement, cette option permet d'éviter l'usage des backslashes pour les motifs de regex. Cette option rend les regex plus lisibles.

Citation:
Envoyé par foulla Voir le message
2- la ligne de commande que vous m'avez donnée fonctionne à merveille, mais elle n'apporte pas la modification au fichier traité, parce que quand j'ai exécuté "sed ..." elle m'a affiché le résultat modifié en bas de la fenêtre de Cygwin, par contre le script que je manipule n'a pas été touché, je l'ai ouvert après, mais j'ai remarqué qu'il n' a pas été touché !!
comment je peux apporter les modifications au script sans passé par du copier coller ?
Soit tu rediriges la sortie vers un nouveau fichier (méthode prudente):
sed 's/motif/remplacement/gi' fichier > nouveau.fichier

Soit tu modifies directement le fichier avec option -i (prudence! faire copie de sauvegarde avant)
sed -i 's/motif/remplacement/gi' fichier

A la relecture de mon post ci-dessus, il serait aussi indiqué d'ajouter l'option g derrière l'expression sed pour faire un remplacement global (toutes les occurrences)

sed 's/motif/remplacement/gi
__________________
:q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
:quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
Jabber: ripat at im.apinc.org
ripat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2008, 12h43   #5
Candidat au titre de Membre du Club
 
Inscription : avril 2007
Messages : 78
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 78
Points : 11
Points : 11
ça marche merci bcp
foulla est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h07.


 
 
 
 
Partenaires

Hébergement Web