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

SGBD Perl Discussion :

[sgbd]Probleme caractere perl ( ' ) et script insertion SQL


Sujet :

SGBD Perl

  1. #1
    Membre du Club Avatar de perlgirl
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 123
    Points : 62
    Points
    62
    Par défaut [sgbd]Probleme caractere perl ( ' ) et script insertion SQL
    Coucou

    J'ai crée les tables de ma base de données et j'ai ensuite lancé mon script d'insertion qui va donc permettre d'inserer l'ensemble de mes données dans les tables correspondantes.

    Ces données sont des informations issus d'un programme perl qui extrait les infos dans des sequences d'ADN...

    Lors de l'insertion il y a des erreurs dû à la présence de simple quote dans le texte de certaines de mes données a inserer ce qui est donc interprété ...

    Je donne un exemple pour que cela soit plus claire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print SQL " INSERT into info_tigr (numacc, idtigr, signal, length_seq, classement, position, polya, nameseq, date) VALUES ($comp, '$cle1', '$tab_tags[5]', '$tab_tags[3]', '$cle2', '$tab_tags[1]', '$tab_tags[4]', '$tab_tags[6]', '2004-05-26');\n";
    ce qui donne par ex dans mon fichier SQL:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     INSERT into info_tigr (numacc, idtigr, signal, length_seq, classement, position, polya, nameseq, date) VALUES (4060, 'TC260187', 'no Signal', '3186', 'Rn2', '3095', 'no', 'homologue to SP|P49902|5NTC_HUMAN Cytosolic purine 5'-nucleotidase  (5'-nucleotidasecytosolic II)', '2004-05-26');
    et voici l'erreur qui m'est indiqué quand je lance le fichier d'insertion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    psql:insertion151004.sql:161709: ERROR:  syntax error at or near "'-nucleotidasecytosolic II)'" at character 244
    Donc je pense que c'est a cause du "5' " car le " ' " est interprété mais je ne suis pas sure et si c'est a cause de cela comment je peux y remedier

    Merci d'avance

    Perlgirl

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    il faut remplacer le "'" par "''" :
    s/"'"/"''"/ il me semble

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 42
    Points : 43
    Points
    43
    Par défaut
    Et mettre tout simplement 5\\' dans la chaîne de requête...
    ça ne fonctionne pas ?

  4. #4
    Membre du Club Avatar de perlgirl
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 123
    Points : 62
    Points
    62
    Par défaut
    J'ai deja essayé de remplacer les simples quote " ' " par les doubles " " " mais apres c'est le programme perl qui ne s'execute pas car ca ne lui convient pas...

    Perlgirl

  5. #5
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 582
    Points : 2 030
    Points
    2 030
    Par défaut
    s/\'/\'\'/g;

    pas joli mais logiquement, ça marche

  6. #6
    Membre du Club Avatar de perlgirl
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 123
    Points : 62
    Points
    62
    Par défaut
    Ben en fait sur 80 séquences traitées apparemment il n'y en a que qques unes qui comportent l'ecriture "5' " et comme je recupere les noms de séquences dans une variable je ne peux pas controler pour rajouter " 5\' "...

    Perlgirl

  7. #7
    Membre du Club Avatar de perlgirl
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 123
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par perlgirl
    Ben en fait sur 80 000 séquences traitées apparemment il n'y en a que qques unes qui comportent l'ecriture "5' " et comme je recupere les noms de séquences dans une variable je ne peux pas controler pour rajouter " 5\' "...

    Perlgirl

  8. #8
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 582
    Points : 2 030
    Points
    2 030
    Par défaut
    Le but, c'est de remplacer 1 simple quote par 2 simples quotes, pas par des doubles quotes.

  9. #9
    Membre du Club Avatar de perlgirl
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 123
    Points : 62
    Points
    62
    Par défaut
    remplacer les simple quote a quel niveau ???

  10. #10
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 582
    Points : 2 030
    Points
    2 030
    Par défaut
    Citation Envoyé par perlgirl
    remplacer les simple quote a quel niveau ???
    Quand tu as des simples quotes dans une chaîne et que tu veux faire un insert ou un update de la chaîne dans une BDD style Oracle ou MySql, la simple quote est considéré comme délimiteur de chaîne en langage SQL.

    De fait, pour obliger SQL à ignorer une simple quote qu'il trouve à l'intérieur d'une chaîne, il faut donc mettre 2 simples quotes au lieu d'une. Comme ça, SQL n'interprête pas la simple quote, il la considère juste comme un vulgaire caractère.

  11. #11
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 582
    Points : 2 030
    Points
    2 030
    Par défaut
    Perso, je ferais comme ceci pour ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT into info_tigr (numacc, idtigr, signal, length_seq, classement, position, polya, nameseq, date) VALUES (4060, "TC260187", "no Signal", "3186", "Rn2", "3095", "no", "homologue to SP|P49902|5NTC_HUMAN Cytosolic purine 5''-nucleotidase  (5''-nucleotidasecytosolic II)", "2004-05-26");
    - j'ai remplacé tes simples quotes délimitant chaque chaîne par des doubles quotes ---> permet l'interpolation des variables éventuellement contenues dans la chaîne
    - pour le dernier champ de l'enregistrement, 5''-nucleotidase, ce n'est pas une double mais une simple quote que tu vois après le 5

  12. #12
    Membre du Club Avatar de perlgirl
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 123
    Points : 62
    Points
    62
    Par défaut
    D'accord mais si je fais cela ca veut dire que par la suite quand je vais interroger ma bdd l'un de mes resultat de requete pourra me donner:

    ...... 5'' ... au lieu de ....5'....

    c'est bien cela??

  13. #13
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 582
    Points : 2 030
    Points
    2 030
    Par défaut
    SQL fait sa tambouille tout seul, ne t'inquiètes pas et ton enregistrement contiendra bien un champ dont la valeur exacte est
    homologue to SP|P49902|5NTC_HUMAN Cytosolic purine 5'-nucleotidase (5'-nucleotidasecytosolic II)

  14. #14
    Membre du Club Avatar de perlgirl
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 123
    Points : 62
    Points
    62
    Par défaut
    Alors j'ai bien compris qu'il fallait que je remplace les simples quotes par les doubles quotes à ce niveau là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print SQL " INSERT into info_tigr (numacc, idtigr, signal, length_seq, classement, position, polya, nameseq, date) VALUES ($comp, '$cle1', '$tab_tags[5]', '$tab_tags[3]', '$cle2', '$tab_tags[1]', '$tab_tags[4]', '$tab_tags[6]', '2004-05-26');\n";
    ce qui va me générer le fichier SQL suivant avec des double quote a la place des simples:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    INSERT into info_tigr (numacc, idtigr, signal, length_seq, classement, position, polya, nameseq, date) VALUES (4060, 'TC260187', 'no Signal', '3186', 'Rn2', '3095', 'no', 'homologue to SP|P49902|5NTC_HUMAN Cytosolic purine 5'-nucleotidase  (5'-nucleotidasecytosolic II)', '2004-05-26');
    Mais pour modifier 5' en 5' ' il faut que je modifie la variable $tab_tags[6]???

  15. #15
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 582
    Points : 2 030
    Points
    2 030
    Par défaut
    oui, avant de faire ton insertion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $tab_tags[6] =~ s/\'/\'\'/g;

  16. #16
    Membre du Club Avatar de perlgirl
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 123
    Points : 62
    Points
    62
    Par défaut
    Ayééé j'ai testé et je n'ai plus de mess d'erreur lors de l'insertion dans la bdd.
    Merci beaucoup Arioch .

    Perlgirl

  17. #17
    Membre habitué
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mars 2005
    Messages
    251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 251
    Points : 174
    Points
    174
    Par défaut
    Il n'y a aucun moyen de traiter cela directement dans le pg_dump ???
    C'est hallucinant !!
    Ma base fait des dizines de milliuers de lignes, je ne vais as m'amuser a faire cela a chaque fois.

    Il y a bien une solution !! Sinon postgres ne serait pas aussi réputée

  18. #18
    Membre actif
    Inscrit en
    Février 2005
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 167
    Points : 203
    Points
    203
    Par défaut Re: Probleme caractere perl ( ' ) et script insertion SQL
    Citation Envoyé par perlgirl
    J'ai crée les tables de ma base de données et j'ai ensuite lancé mon script d'insertion qui va donc permettre d'inserer l'ensemble de mes données dans les tables correspondantes.

    ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print SQL " INSERT into info_tigr (numacc, idtigr, signal, length_seq, classement, position, polya, nameseq, date) VALUES ($comp, '$cle1', '$tab_tags[5]', '$tab_tags[3]', '$cle2', '$tab_tags[1]', '$tab_tags[4]', '$tab_tags[6]', '2004-05-26');\n";
    Je propose que tu laisses tomber l'idée de malaxer les données toi-même avec des regexps, tu tomberas toujours sur des données qui font tout casser. Sers-toi du module DBI pour qu'il fasse le boulot à ta place.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    my $db = DBI->connect("dbi:Pg:dbname=truc", "moi", "passwd");
    END { $db and $db->disconnect }
     
    print SQL "INSERT into info_tigr (a, b, c) values ("
        . join( ',',
            $db->quote( $tab_tags[6] ),
            '2004-01-02',
            $db->quote( $tab_tags[2] ),
        )
        . ");\n";
    Notes comment j'utilise join pour me faire les virgules au bon endroit entre les champs, je n'ai pas à me prendre la tête à vérifier que tout est nickel.

    Ce code n'utilise pas le module DBI pour faire l'insertion, tu continueras à utiliser psql pour l'import, mais je me demande si le temps que ça prend d'écrire le fichier et puis le relire avec psql ne serait pas plus lent que d'insérer les lignes directement dans ton script Perl via un statement préparé.

    Tu peux d'ailleurs très bien dropper les index au début et les recréer à la fin du script de toute façon (ce que, je suppose, tu fais déjà dans le script pour psql).

    N

  19. #19
    Membre actif
    Inscrit en
    Février 2005
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 167
    Points : 203
    Points
    203
    Par défaut
    Citation Envoyé par Tchinkatchuk
    Il n'y a aucun moyen de traiter cela directement dans le pg_dump ???
    C'est hallucinant !!
    Ma base fait des dizines de milliuers de lignes, je ne vais as m'amuser a faire cela a chaque fois.

    Il y a bien une solution !! Sinon postgres ne serait pas aussi réputée
    Bien sûr que si. Il suffit juste de quoter les données avant de les passer. L'utilisation de DBI est la solution. J'ai des tables dans Postgres qui ont frôle les 500 millions de lignes et pas de problème de perf que ce soit au niveau de l'insertion ou de l'extraction.

  20. #20
    Membre habitué
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mars 2005
    Messages
    251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 251
    Points : 174
    Points
    174
    Par défaut
    Merci beaucoup nematoad !!

    Je vias regarder cela.

    Mais j'a un autre probleme qui concerne le forum postgres.
    L'insertion se fait dans l'ordre alphabetique des tables du coup, a cause des cles etrangeres, ca foire !!! Je commence sensiblement a m'énerver

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

Discussions similaires

  1. Outil gratuit pour faire des scripts insert SQL
    Par Nico820 dans le forum Outils
    Réponses: 2
    Dernier message: 13/04/2011, 08h52
  2. probleme jeux de caractere et collation en my sql
    Par rachidbel dans le forum Administration
    Réponses: 7
    Dernier message: 01/09/2006, 18h25
  3. [SGBD] [Problème insertion variable php/mysql]
    Par vincedjs dans le forum Installation
    Réponses: 20
    Dernier message: 08/02/2006, 16h41
  4. Réponses: 2
    Dernier message: 22/07/2004, 00h27
  5. Réponses: 2
    Dernier message: 30/05/2002, 08h54

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