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 :

[regex][CSV]Exclure les séparateurs entre guillemets


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Avatar de Eric Berger
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2002
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2002
    Messages : 346
    Par défaut [regex][CSV]Exclure les séparateurs entre guillemets
    Je suis une bille en expressions régulières..... j'ai donc tout naturellement un problème avec ces dernières...

    Je parse des fichiers CSV pour splitter sur les séparateurs, or il se trouve que j'ai des séparateurs qui se trouvent entre guillemets et que ceux-ci doivent être ignorés.... et là.... je bloque....

    Exemple
    devrait donner:
    et non:
    Je cherche donc une expression régulière qui me permet d'ignorer les virgules si elles sont entre guillemets.

    Merci d'avance pour vos réponses.

    Eric

  2. #2
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 6
    Par défaut
    J'ai le meme probleme que toi , j'espere que tu as trouve la solution , sinon tu peux me proposer des solution que tu as essaye...

  3. #3
    maa
    maa est déconnecté
    Membre éclairé
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Par défaut
    Je propose cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
                string s = "aaa,bbb,\"cc,c\",ddd"; 
     
                Regex r = new Regex("(((([^,\"]+),?)*)(\")(.*?)(\",)((([^,\"]+),?)*))+");
                GroupCollection gs = r.Match(s).Groups;
     
                var captures = (new List<Group> { gs[4], gs[6], gs[9] })
                               .SelectMany(g => from c in g.Captures.OfType<Capture>() select c);
     
                foreach (var c in captures)
                    Console.WriteLine(c.Value);

  4. #4
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Je n'ai pas réussi avec le Split, alors j'ai essayé de procéder autrement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    string input = "aaa,\"\",\"\",bbb,,\"cc,c\",\"jjj,j\",ddd";
    string pattern = "(\"[^\"]*\"|[^,]*),?";
    MatchCollection coll = Regex.Matches(input, pattern);
    for (int i = 0; i < coll.Count - 1; i++)
    {
        string s = coll[i].Groups[1].Value;
    }
    Le dernier item de la collection ne correspond à rien, donc j'ai utilisé un for plutôt qu'un foreach.

    Si ca peut aider

  5. #5
    maa
    maa est déconnecté
    Membre éclairé
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Par défaut
    C'est vrai que c'est plus beau comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    string s = "aaa,bbb,\"cc,c\",ddd";
    Regex r = new Regex("((\"[^\"]*\"|[^,]*),?)*");
    foreach (Capture c in r.Match(s).Groups[2].Captures)
        Console.WriteLine(c.Value);

  6. #6
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    J'aurais tendance à trouver celle-là plus jolie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "((?<token>\".*?\"|[^,]*),?)*"
    J'ai préféré utiliser un quantifieur feignant, pour améliorer le traitement des longues chaines.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

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

Discussions similaires

  1. Regex trouver ce qui est entre guillemet
    Par giova_fr dans le forum C#
    Réponses: 0
    Dernier message: 18/04/2013, 14h46
  2. mettre les caractères entre guillemet dans une variable
    Par deltaweb dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 31/03/2013, 03h15
  3. [RegEx] Regex pour detecter les virgules non entre guillemets
    Par calitom dans le forum Langage
    Réponses: 8
    Dernier message: 06/09/2010, 14h38
  4. [RegEx] Trouver les mots entre guillemets
    Par naynay dans le forum Langage
    Réponses: 6
    Dernier message: 20/07/2009, 16h43

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