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 :

Regex, besoin d'explication


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé

    Profil pro
    MOA
    Inscrit en
    Décembre 2002
    Messages
    1 226
    Détails du profil
    Informations personnelles :
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : MOA

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 226
    Par défaut [Regex] Erreur caractères surnuméraires - conversion date
    Bonjour,

    • Introduction

    Tout d'abord, je tiens à preciser que je tiens à signaler que je ne cherche pas forcement la reponse toute faite, mais que l'on m'explique pourquoi cela ne marche.

    Cela me désole, des qu'il s'agit d'une regex un peu compliqué, cela ne marche jamais avec moi.


    • Sujet

    J'ai un fichier excel avec 3 colonnes pouvant contenir n'importe quel caractères. Je fais un copié collé des cellules du tableur dans mon gvim. J'obtiens donc par exemple ce genre de résultat :



    • Résultat attendu


    insert MATABLE set f1='33' ,f2='77' ,f3='33';
    insert MATABLE set f1='4' ,f2='8' ,f4='333';

    • Mes premiers tests :


    J'ai fais le choix d'utiliser le caractère # délémiteur pour que ce soit un peu plus claire au du \.

    J'ai tenté ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    :%s#\(^.*)\t\(.*)\t(.*$)#\1#g
    mais cela me mets comme erreur :
    E54: \( ouvrante non fermée
    E478 : Commande non valide
    • Mon raisonnement :


    Je vous explique comment j'ai ecris mon pattern. N'hesitez pas à me corriger la ou mon raisonnement n'est pas correct. J'ai donc fais expres de bien comment j'ai écris le pattern.

    pattern : \(^.*)\t\(.*)\t(.*$)

    Le premier sous ensemble :

    Le premier sous ensemble commence dès le début de la ligne (utilisation de ^)
    et et est une suite de 1 ou plusieurs caractères :
    Le premier sous ensemble s'arrete a la première tabulation, je mets donc juste apres le premier sous \t
    Pour que le premier sous ensemble soit bien reconnu comme sous ensemble, je mets un \
    Le deuxième sous ensemble :

    Le deuxième sous ensemble commence juste apres la première tabulation et il est constitué de n'importe quel caractères et se termine par la 2ème tabulation :
    Le troisième sous ensemble :

    Le troisième sous ensemble est commence apres la 2ème tabulation. Il est constitué de n'importe quel caractère et est à la fin de la ligne (utilisation de $)
    Ou me suis je trompé ?

  2. #2
    Membre émérite Avatar de BlaireauOne
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    492
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 492
    Par défaut
    Citation Envoyé par weed
    • Sujet

    J'ai un fichier excel avec 3 colonnes pouvant contenir n'importe quel caractères. Je fais un copié collé des cellules du tableur dans mon gvim. J'obtiens donc par exemple ce genre de résultat :



    • Résultat attendu


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    insert MATABLE set f1='33' ,f2='77' ,f3='33';
    insert MATABLE set f1='4' ,f2='8' ,f4='333';

    Tout d'abord, bonne idée de mettre '#' au lieu de '/', c'est déja +clair

    Important à savoir, la recherche .*\t est de type "gourmande".
    C'est à dire que la recherche ne s'arrêtera pas à la 1ère tabulation rencontrée mais à la dernière.
    Exemple :
    33\t77\t33

    Astuce pour ne sélectionner que jusqu'à la 1ère tabulation :
    ^[^\t]*\t/
    Signifie : sélectionne ( à partir du début de la ligne ^ ) tous les caractères différents de tabulation ( [^\t] ) présents 0 ou n fois ( * ) jusqu'à la tabulation suivante ( \t ).
    Résultat :
    33\t77\t33

    Pour mémoriser une partie de la chaîne, en l'occurence les chiffres sans la tabulation : \( \)
    ^\([^\t]*\)\t

    Avec ces éléments, tu peux décoder l'instruction ci-dessous qui doit fonctionner

    :s#\(^[^\t]*\)\t\([^\t]*\)\t\([^\t]*$\)#insert MATABLE set f1='\1', f2='\2', f3='\3'#

    http://www.shellunix.com/regexp.html

  3. #3
    Membre éprouvé

    Profil pro
    MOA
    Inscrit en
    Décembre 2002
    Messages
    1 226
    Détails du profil
    Informations personnelles :
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : MOA

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 226
    Par défaut Date conversion
    Tout d'abord, merci mille fois BlaireauOne.
    J'ai vraiment compris le truc. Je ne regarde pas ma regex sur mon post, je l'as refais à chaque fois que j'en ai besoin.


    Par contre je bloque sur une date. J'ai une date francais, j'aimerais bien la convertir au format iso yyyy-mm-dd.

    J'aimerais le faire en php avec preg_replace par exemple mais avant tout j'aimerais bien tester sous gvim.

    J'ai donc fais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    %s#\([0-9{1,2}\)\/\([0-9{2}\)\/\([0-9{2,4}\)#\3-\2\1#g
    gvim me retourne comme erreur :
    E:488 caractères surnuméraires

    Qu'est ce que cela veut dire ? J'ai regardé sur google mais que de chi :
    http://www.google.fr/search?hl=fr&q=...chercher&meta=

  4. #4
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Par défaut
    Citation Envoyé par weed
    J'ai donc fais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    %s#\([0-9{1,2}\)\/\([0-9{2}\)\/\([0-9{2,4}\)#\3-\2\1#g
    gvim me retourne comme erreur :
    E:488 caractères surnuméraires
    Ca irait pas mieux en fermant les crochets ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    %s#\([0-9]{1,2}\)\/\([0-9]{2}\)\/\([0-9]{2,4}\)#\3-\2\1#g
    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  5. #5
    Membre éprouvé

    Profil pro
    MOA
    Inscrit en
    Décembre 2002
    Messages
    1 226
    Détails du profil
    Informations personnelles :
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : MOA

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 226
    Par défaut
    ahh super. C'etait du a cela pour mon erreur.

    Lorsque j'execute cela me met motif introuvable alors que je mets mon curseur avec 12/12/2006....

    Je ne vois pas ou j'ai fais une faute dans mon pattern.

    Je fais une recherche
    d'une suite de chiffre (1 seul ou 2)
    puis le caractère /
    d'une suite de chiffres (2 chiffres uniquement)
    puis le caractère /
    et une suite de chiffres (2 ou 4 chiffres)

    L'espression peut se trouver n'importe ou dans la ligne, je n'ai donc pas spécifié ni de ^ ni de $

  6. #6
    Membre émérite Avatar de BlaireauOne
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    492
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 492
    Par défaut
    Citation Envoyé par weed
    Je ne vois pas ou j'ai fais une faute dans mon pattern.

    Il ne manque plus que des antislash devant les accolades ouvrantes et fermantes et ça marche

    Petit conseil. Si PB de ce genre, faire une recherche progressive du + simple au + complexe.

    Sous vim, recherche de chaîne /

    /[0-9] OK, on continue
    /[0-9]{2} pas OK, on appelle l'aide en ligne
    :help pattern

Discussions similaires

  1. [Regex] besoin d'aide sur des motifs
    Par Oluha dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 25/11/2005, 11h23
  2. Besoin d'explications sur un bout de code
    Par zizitop dans le forum C
    Réponses: 7
    Dernier message: 26/04/2005, 14h51
  3. [C#] J'aurais besoin d'explication
    Par Roach- dans le forum Windows Forms
    Réponses: 18
    Dernier message: 10/03/2005, 16h00
  4. Besoin d'explications sur float et l'élasticité !
    Par KneXtasY dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 14/01/2005, 15h15
  5. [Foreign Key] Besoin d'explication.
    Par Andry dans le forum Débuter
    Réponses: 4
    Dernier message: 28/05/2003, 11h34

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