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

C# Discussion :

(Expression régulière) Traitement d'un fichier txt


Sujet :

C#

  1. #21
    Membre habitué Avatar de 4rocky4
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 528
    Points : 180
    Points
    180
    Par défaut
    Bah pour les groupes, il faut récupérer le bloc :

    FOREIGN KEY ..... ,

    et

    FOREING KEY ...... ;

    Une fois que cela est fait, on regarde si "ON UPDATE CASCADE" est présent et si il y est on créer le trigger en utilisant les clefs étrangères.

    Mais là je vois pas comment il est possible de récupérer le premier bloc FOREIGN KEY jusqu'à la virgule puis également le second jusqu'au point virgule.

    Ce n'est peut être pas possible de faire ça en une seule expression régulière ... ?
    "J'glande pas ! Ça compile ..."

    4rocky4
    - Un con qui marche ira plus loin q'un intellectuel assis -

  2. #22
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 201
    Points : 196
    Points
    196
    Par défaut
    Sisi bien sur, mais pas besoin de passer par les groupes, ce que tu veux récupérer c'est carrément toute la Regex.

    Je pense que tu fais un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Regex finder = new Regex("Pattern");
    foreach(Match m in finder.Matches("template"))
    {
         //blahblahblah
    }
    si c'est bien ça que tu fais, regarde ce que vaut m.Value, tu devrais heureux avec ça

  3. #23
    Membre habitué Avatar de 4rocky4
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 528
    Points : 180
    Points
    180
    Par défaut
    Bonjour monsieur DarkHerumor

    Alors j'ai procédé comme expliqué ci-dessus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Regex regex = new Regex(@"FOREIGN KEY\\([^,)]+([,][^)]+?)\\)[^(]+\\([^,)]+([,][^)]+?)\\)(([^,);]+)?)");
     
    foreach(Match m in regex.Matches(texte))
    {
       string test = m.Value;
    }
    test reste à Null
    "J'glande pas ! Ça compile ..."

    4rocky4
    - Un con qui marche ira plus loin q'un intellectuel assis -

  4. #24
    Membre habitué Avatar de 4rocky4
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 528
    Points : 180
    Points
    180
    Par défaut
    En regardant bien, on ne rentre pas dans le foreach.
    Une fois arrivé sur la ligne du foreach, le pas à pas fait :
    ensuite passe sur in mais ne suit pas sur le m et donc saute la boucle.

    un problème dans la regex je pense, j'vais essayer de voir ça
    "J'glande pas ! Ça compile ..."

    4rocky4
    - Un con qui marche ira plus loin q'un intellectuel assis -

  5. #25
    Membre habitué Avatar de 4rocky4
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 528
    Points : 180
    Points
    180
    Par défaut
    J'ai essayé de procéder autrement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Regex regex = new Regex(@"FOREIGN KEY(?<createbloc>[^;]+);");
    MatchCollection m = regex.Matches(texte);
     
    foreach(Match match in m)
    {
       string emplacement = match.Groups["createbloc"].Value;
       if (emplacement.ToUpper().Contains("ON UPDATE CASCADE"))
       {
           string test = match.Value;                              	
       }
    }
    Donc là je récupère tout le bloc FOREIGN KEY.
    Le problème c'est que lorsqu'un CREATE TABLE contient deux FOREIGN KEY, je vais récupérer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    FOREIGN KEY(NUM_L)
        REFERENCES T1_L  (NUM_L)
          ON DELETE CASCADE
          ON UPDATE CASCADE,
      FOREIGN KEY(ID_R, NUM_P)
        REFERENCES T1_R(ID_R, NUM_P)
          ON DELETE CASCADE
          ON UPDATE CASCADE);
    Donc par la suite il va être difficile de retrouver les clefs étrangères du deuxième FOREIGN KEY.

    C'est tout de même possible ou il vaut mieux isoler chque bloc FOREIGN KEY ?
    "J'glande pas ! Ça compile ..."

    4rocky4
    - Un con qui marche ira plus loin q'un intellectuel assis -

  6. #26
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 201
    Points : 196
    Points
    196
    Par défaut
    Le bout de code suivant marche très bien chez moi:
    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
    private static void Main(string[] args)
    {
        string texte = @"FOREIGN KEY(NUM_L)
                            REFERENCES T1_L  (NUM_L)
                                ON DELETE CASCADE
                                ON UPDATE CASCADE,
                        FOREIGN KEY(ID_R, NUM_P)
                            REFERENCES T1_R(ID_R, NUM_P)
                                ON DELETE CASCADE
                                ON UPDATE CASCADE);
                        ";
        Regex regex = new Regex(@"FOREIGN KEY\([^,)]+(([,][^)]+)?)\)[^(]+\([^,)]+(([,][^)]+)?)\)(([^,);]+)?)");
     
        foreach (Match m in regex.Matches(texte))
        {
            string test = m.Value;
        }
     
        return;
    }
    T'es sur de ne rien avoir oublier?

    [EDIT] : J'avais oublier des parenthèse dans la Regex !
    J'édite mon post précédent pour corriger, normalement maintenant c'est bon donc. Désolé de l'erreur

  7. #27
    Membre habitué Avatar de 4rocky4
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 528
    Points : 180
    Points
    180
    Par défaut
    Cela m'a l'air bien correct, merci bien

    Une petite question
    Pourquoi sur certaines regex pour échapper je dois mettre \\ (car avec un j'avais une erreur) alors que là dans la dernière regex, une seul \ suffit ... ?
    "J'glande pas ! Ça compile ..."

    4rocky4
    - Un con qui marche ira plus loin q'un intellectuel assis -

  8. #28
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 201
    Points : 196
    Points
    196
    Par défaut
    Tu avais mis le @ devant la chaine de caractères?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    string str = @"\";
    string str = "\\";

  9. #29
    Membre habitué Avatar de 4rocky4
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 528
    Points : 180
    Points
    180
    Par défaut
    Citation Envoyé par DarkHerumor Voir le message
    Tu avais mis le @ devant la chaine de caractères?
    Bah non

    C'était pas plus compliqué que ça lol

    "J'glande pas ! Ça compile ..."

    4rocky4
    - Un con qui marche ira plus loin q'un intellectuel assis -

  10. #30
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 201
    Points : 196
    Points
    196
    Par défaut
    Pense au

  11. #31
    Membre habitué Avatar de 4rocky4
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 528
    Points : 180
    Points
    180
    Par défaut
    J'ai pas mis résolu car je pense que j'vais avoir encore une ou deux questions lol
    "J'glande pas ! Ça compile ..."

    4rocky4
    - Un con qui marche ira plus loin q'un intellectuel assis -

  12. #32
    Membre habitué Avatar de 4rocky4
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 528
    Points : 180
    Points
    180
    Par défaut
    En voilà une ! lol

    Pour certains blocs FOREIGN KEY, je vais récupérer les deux id entre parenthèses.

    Donc ce que je fais, je créer un groupe contenant toute la chaîne de caractères qui est entre parenthèses
    puis ensuite,
    je fais un IF pour tester si une virgule est présente ou pas.

    Si la virgule est présente, alors je fais deux regex pour récupérer chaque id.

    Ma logique me semble correcte lol


    Par contre, j'ai toujours un problème avec les regex
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Regex regexTABLE = new Regex(@"FOREIGN KEY\((?<clefetrangere>[A-Za-z0-9-_]+)\)");
    Cela ne me permet pas de récupérer la chaîne entre les deux parenthèses.

    J'ai essayé d'inclure \s et \, dans les [] mais je ne crois pas que cela soit possible vue les erreurs.
    "J'glande pas ! Ça compile ..."

    4rocky4
    - Un con qui marche ira plus loin q'un intellectuel assis -

  13. #33
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 201
    Points : 196
    Points
    196
    Par défaut
    Tu peux ajouter un ou des groupes dans la regex principale, pour récupérer le bloc des clés:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Regex regex = new Regex(@"FOREIGN KEY\((?<key>([^,)]+(([,][^)]+)?)))\)[^(]+\([^,)]+(([,][^)]+)?)\)(([^,);]+)?)");
    J'ai juste ajouté le groupe au début. Ensuite tu le recup et tu le Split avec ','
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m.Groups["key"].Value.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
    Et t'as tes clé

  14. #34
    Membre habitué Avatar de 4rocky4
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 528
    Points : 180
    Points
    180
    Par défaut
    J'ai essayé ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    string blocPK = "  FOREIGN KEY(ID_R, NUM_O)
        REFERENCES T2_O(ID_R, NUM_O)
          ON DELETE CASCADE
          ON UPDATE CASCADE";
     
    if (blocPK.ToUpper().Contains("ON UPDATE CASCADE"))
       {  
          Regex regexTABLE = new Regex(@"FOREIGN KEY\((?<clefetrangere>[A-Za-z0-9-_]+),");
          Match matchTABLE = regexTABLE.Match(blocPK);
          string varkey = matchTABLE.Groups["clefetrangere"].Value;
    				}
    varkey me renvoie bien "ID_R"
    "J'glande pas ! Ça compile ..."

    4rocky4
    - Un con qui marche ira plus loin q'un intellectuel assis -

  15. #35
    Membre habitué Avatar de 4rocky4
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 528
    Points : 180
    Points
    180
    Par défaut
    Avant d'essayer ce que tu me proposes, j'ai continué dans ma lancé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    string blocPK = "  FOREIGN KEY(ID_R, NUM_O)
        REFERENCES T2_O(ID_R, NUM_O)
          ON DELETE CASCADE
          ON UPDATE CASCADE";
     
    if (blocPK.ToUpper().Contains("ON UPDATE CASCADE"))
       {  
          Regex regexTABLE = new Regex(@"FOREIGN KEY\((?<clefetrangere>[^\)]+)\)");
          Match matchTABLE = regexTABLE.Match(blocPK);
          string varkey = matchTABLE.Groups["clefetrangere"].Value;
       }
    Et dans varkey j'obtiens "ID_R, NUM_O"

    Donc après il me reste juste à utiliser ta méthode pour faire le split si j'ai bien compris
    "J'glande pas ! Ça compile ..."

    4rocky4
    - Un con qui marche ira plus loin q'un intellectuel assis -

  16. #36
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 201
    Points : 196
    Points
    196
    Par défaut
    Bah là t'a plus qu'a faire le Split sur varkey au final :=)

  17. #37
    Membre habitué Avatar de 4rocky4
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 528
    Points : 180
    Points
    180
    Par défaut
    Citation Envoyé par DarkHerumor Voir le message
    Bah là t'a plus qu'a faire le Split sur varkey au final :=)
    Je pense qu'il me manque une syntaxe ou que la mienne n'est pas correct (J'essaye d'utiliser les cours de Serge Tahé)

    j'effectue le Slipt sur varkey :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    if (varkey.Contains(","))
       {
          string[] clef = varkey.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
          for (int i=0; i<clef.Length;i++)
          {
             string clef["+i+"] = ["+clef[i]+"];
          }
       }
    Donc comme ça je ne récupère pas les clefs ...
    "J'glande pas ! Ça compile ..."

    4rocky4
    - Un con qui marche ira plus loin q'un intellectuel assis -

  18. #38
    Membre habitué Avatar de Antho42
    Profil pro
    Inscrit en
    Février 2009
    Messages
    173
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 173
    Points : 161
    Points
    161
    Par défaut
    Citation Envoyé par 4rocky4 Voir le message
    Je pense qu'il me manque une syntaxe ou que la mienne n'est pas correct (J'essaye d'utiliser les cours de Serge Tahé)

    j'effectue le Slipt sur varkey :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    if (varkey.Contains(","))
       {
          string[] clef = varkey.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
          for (int i=0; i<clef.Length;i++)
          {
             string clef["+i+"] = ["+clef[i]+"];
          }
       }
    Donc comme ça je ne récupère pas les clefs ...
    Tes deux clés sont déja stockées dans clef[], en l'occurence la première dans clef[0] et la seconde dans clef[1].
    donc tu n'as pas besoin de ta boucle for a première vue.

  19. #39
    Membre habitué Avatar de 4rocky4
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 528
    Points : 180
    Points
    180
    Par défaut
    J'ai essayé d'une autre façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    if (varkey.Contains(",");
    {
       Regex modele = new Regex(@",");
       string[] clef=modele.Split(varkey);
     
       for (int i=0;i<clef.Length;i++)
       {
          string clef1=("clef["+i+"]=["+clef[i]+"]");
       }
    La variable clef1 contient "clef[0]=[ID_R]"
    "J'glande pas ! Ça compile ..."

    4rocky4
    - Un con qui marche ira plus loin q'un intellectuel assis -

  20. #40
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 201
    Points : 196
    Points
    196
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string clef["+i+"] = ["+clef[i]+"];
    C'est quoi cette syntaxe?

    Woaw j'ai l'impression que tu te compliques les choses là O.o

    Fais simplement un varkey.Split(new char[] {','}, /*...*/ );
    ça te retourne un tableau de string avec pour chaque Itération une clé.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Traitement d'un fichier txt
    Par anass_59 dans le forum Général Python
    Réponses: 15
    Dernier message: 23/06/2009, 11h13
  2. Expressions régulières : traitement de HtmlPage + API HtmlUnit
    Par lahmar.abdel1 dans le forum Général Java
    Réponses: 2
    Dernier message: 30/04/2009, 14h16
  3. traitement d'un fichier txt
    Par arezki76 dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 22/06/2007, 14h36
  4. Réponses: 9
    Dernier message: 03/01/2007, 17h06

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