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

Java Discussion :

Découpage d'une chaîne


Sujet :

Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 43
    Points : 33
    Points
    33
    Par défaut Découpage d'une chaîne
    Bonjour,

    J'ai une chaîne de caractère valant "ou=abcd,ou=efgh,ou=ijklmnop etc..."
    Je veux récupérer plusieurs champ A valant abcd , champ B valant efgh champ C valant ijklmnop.
    Pour le premier champ A, j'utilise la fonction Substr(IndexOf(ma_chaine,"="),IndexOf(ma_chaine,",") mais ensuite je ne sais pas récupérer les autres champ.. je ne sais pas si il existe une fonction pour connaître l'index de la deuxième occurrence = ?

    Merci si vous m'aidez

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 394
    Points : 1 212
    Points
    1 212
    Par défaut
    Bonjour,

    Tu as plusieurs façons de faire, plus ou moins faciles et élégantes...

    Si tu arrives à récupérer le premier champ, il te "suffit" de recommencer ta manipulation sur la chaîne restante (après avoir retirer la partie correspondant à ton premier champ), etc. Mais c'est pas super joli, ni efficace...

    Si le "motif" délimitant tes champs est toujours le même (en l'occurence ou= il semblerait), tu peux utiliser la fonction split() de la classe String. Cela va te créer un tableau dont chaque case contiendra un champ (attention toutefois aux éventuelles "," qui risque de traîner).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String tableauChamps = maChaine.split("ou=");
    Enfin, la meilleure façon de faire serait de travailler avec les expressions régulières, mais je risque d'écrire n'importe quoi si je te mets un exemple concret...

    Mako.

  3. #3
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 318
    Points
    8 318
    Billets dans le blog
    52
    Par défaut
    1. Tu supprime les "ou="
    2. Tu split sur les vigules :

    Résultat avec la javadoc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    String myChain = "ou=abcd,ou=efgh,ou=ijklmnop";
    myChain.replace("ou=","");
    String[] myVariables =myChain.split(",")
    System.out.println(myVariables );
    Cordialement,
    Patrick Kolodziejczyk.

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    Citation Envoyé par Mako 5013 Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String tableauChamps = maChaine.split("ou=");
    Enfin, la meilleure façon de faire serait de travailler avec les expressions régulières, mais je risque d'écrire n'importe quoi si je te mets un exemple concret...

    Mako.
    Split utilise des expression régulière , du coup tu as déjà donné l'exemple, que je corrigerais comme ceci pour la virgule


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String[] tableauChamps = maChaine.split(",?ou=");

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 559
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 619
    Points
    21 619
    Par défaut
    Vous savez, c'est du LDAP, et personne n'a jamais dit qu'il ne peut pas y avoir par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "ou=abou=cd,ou=efgh,ou=ijklou=mnop"
    Donc :
    - D'abord splitter sur "," sans rien avoir à cirer des ou=
    - Ensuite virer le ou= de devant chaque donnée. Par Exemple avec substring(3) puisque ou= est une String de taille 3.

  6. #6
    En attente de confirmation mail
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Novembre 2011
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2011
    Messages : 50
    Points : 40
    Points
    40
    Par défaut avec Pattern Matcher et éventuellement Scanner
    Utiliser les Pattern permet aussi de parcourir plusieurs lignes et les gros fichiers.
    Je pense aux .log qui peuvent atteindre plusieurs millions de lignes en production.

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     public static void main(final String[] args) {
            final boolean avecVirguleFinale = //
            false
            // true
            //
            ;
            final String s = "ou=ab   ,ou=cd,ou=efgh, ou=ijkl, ou=mnop ";
            Pattern p; // Le Pattern doit être compilé avant la boucle
            Matcher m;
            if (!avecVirguleFinale) {
                // On est obligé de tester la fin de ligne séparémment
                p = Pattern.compile("(=).[A-Z ]*(,)|(=).[a-zA-Z]*($)",
                    Pattern.CASE_INSENSITIVE);
                // les () délimitent les groupes
                m = p.matcher(s.trim());
            } else {
                p = Pattern.compile("(=).[A-Z ]*(,)", Pattern.CASE_INSENSITIVE);
                // les () délimitent les groupes
                m = p.matcher(s.trim() + ",");
            }
            final int i = m.regionStart();
            System.out.println("i==" + i + ", " + m);
            while (m.find()) {
                System.out.println(m.group().replaceAll("=|,", ""));
            }
     
            System.out
                .println("--- Avec Scanner + 'avecVirguleFinale = false;' obligatoire ---");
            final Scanner scan = new Scanner(s);
            // on peut aussi remplacer s par : new File(url_ou_path_fichier);
            while (scan.hasNext()) {
                final String champLu = scan.next();
                System.out.println("scan.hasNext() == " + champLu);
                m = p.matcher(champLu.trim());
                while (m.find()) {
                    System.out.println("\t" + m.group().replaceAll("=|,", ""));
                }
            }
        }
    Ce qui donne à la console
    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
     
    i==0, java.util.regex.Matcher[pattern=(=).[A-Z ]*(,)|(=).[a-zA-Z]*($) region=0,40 lastmatch=]
    ab
    cd   
    efgh
    ijkl
    mnop
    --- Avec Scanner + 'avecVirguleFinale = false;' obligatoire ---
    scan.hasNext() == ou=ab,ou=cd
    	ab
    	cd
    scan.hasNext() == ,ou=efgh,
    	efgh
    scan.hasNext() == ou=ijkl,
    	ijkl
    scan.hasNext() == ou=mnop
    	mnop

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 559
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 619
    Points
    21 619
    Par défaut
    Citation Envoyé par cylere Voir le message
    Utiliser les Pattern permet aussi de parcourir plusieurs lignes et les gros fichiers.
    Certes, mais pour une pauvre expression LDAP, c'est sans doute un chouilla plus compliqué que nécessaire.

  8. #8
    En attente de confirmation mail
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Novembre 2011
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2011
    Messages : 50
    Points : 40
    Points
    40
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Certes, mais pour une pauvre expression LDAP, c'est sans doute un chouilla plus compliqué que nécessaire.
    J'ai plutôt voulu essayer d'extraire les chaînes dans un contexte 'réel', c'est à dire ou la position des ',' des ' ' et autres signes interférant entre UTF-8 et ISO-8859-15 ne sont pas forcément à la place attendue.
    ... histoire de ne pas être rappelé par le 'client' par ce que je suis un imbécile qui livre des APIs qui plantent,
    ... s'il n'en parle pas directement au patron.

  9. #9
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 559
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 619
    Points
    21 619
    Par défaut
    Et c'est sans doute mieux pour des logs géants au format arbitraire, mais pour une pauvre expression LDAP, c'est sans doute un chouilla plus compliqué que nécessaire.

Discussions similaires

  1. Découpage d'une chaîne de caractères
    Par dr_anas dans le forum C++
    Réponses: 6
    Dernier message: 24/06/2013, 15h13
  2. [Regex] Découpage d'une chaîne en groupes
    Par La Truffe dans le forum Langage
    Réponses: 2
    Dernier message: 12/03/2008, 14h36
  3. Découpage d'une chaîne
    Par bremer dans le forum Langage
    Réponses: 18
    Dernier message: 28/01/2008, 19h20
  4. Découpage d'une chaîne de caractères
    Par karinhalabi dans le forum Cobol
    Réponses: 1
    Dernier message: 11/04/2007, 16h22
  5. Découpage d'une chaîne de caractère
    Par turbo_chess dans le forum C
    Réponses: 1
    Dernier message: 01/04/2007, 12h17

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