Précédent   Forum des professionnels en informatique > Java > Général Java
Général Java Java SE, Java ME, APIs, Persistance, JDBC, Spring, XML. Avant de poster -> FAQ Java, Sources Java
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 24/01/2012, 16h21   #1
Invité régulier
 
Inscription : mars 2003
Messages : 43
Détails du profil
Informations personnelles :
Âge : 30

Informations forums :
Inscription : mars 2003
Messages : 43
Points : 9
Points : 9
Envoyer un message via MSN à besco
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
besco est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 16h57   #2
Membre Expert
 
Homme
Développeur informatique
Inscription : avril 2010
Messages : 388
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

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

Informations forums :
Inscription : avril 2010
Messages : 388
Points : 1 576
Points : 1 576
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 :
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.
Mako 5013 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/01/2012, 17h06   #3
Membre Expert
 
Avatar de kolodz
 
Homme Patrick Kolodziejczyk
Étudiant
Inscription : avril 2008
Messages : 441
Détails du profil
Informations personnelles :
Nom : Homme Patrick Kolodziejczyk
Âge : 24
Localisation : France, Val d'Oise (Île de France)

Informations professionnelles :
Activité : Étudiant
Secteur : Enseignement

Informations forums :
Inscription : avril 2008
Messages : 441
Points : 1 559
Points : 1 559
Envoyer un message via MSN à kolodz
1. Tu supprime les "ou="
2. Tu split sur les vigules :

Résultat avec la javadoc :
Code :
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.
__________________
N'oubliez pas de marquer vos discussions
Si une réponse vous a été utile pensez à voter Pour
Pensez à la javadoc
kolodz est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/01/2012, 17h49   #4
Modérateur
 
Avatar de tchize_
 
Homme
Responsable de service informatique
Inscription : avril 2007
Messages : 16 196
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
Localisation : Belgique

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Service public

Informations forums :
Inscription : avril 2007
Messages : 16 196
Points : 25 344
Points : 25 344
Envoyer un message via MSN à tchize_ Envoyer un message via Skype™ à tchize_
Citation:
Envoyé par Mako 5013 Voir le message

Code :
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 :
1
2
 
String[] tableauChamps = maChaine.split(",?ou=");
__________________
⥀⥁ Чиз faq java, cours java, javadoc. Pensez à et
"Votre génitrice tute des pédoncules au pandémonium" (le conjurateur, 1973)
tchize_ est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/01/2012, 17h54   #5
Expert Confirmé Sénior
 
Inscription : septembre 2004
Messages : 5 092
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 5 092
Points : 7 019
Points : 7 019
Vous savez, c'est du LDAP, et personne n'a jamais dit qu'il ne peut pas y avoir par exemple :

Code :
"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.
thelvin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 14h12   #6
Membre du Club
 
Homme Claude RICHARD
Chef de projet NTIC
Inscription : novembre 2011
Messages : 50
Détails du profil
Informations personnelles :
Nom : Homme Claude RICHARD
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 :
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 :
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
cylere est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 14h38   #7
Expert Confirmé Sénior
 
Inscription : septembre 2004
Messages : 5 092
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 5 092
Points : 7 019
Points : 7 019
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.
thelvin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 14h53   #8
Membre du Club
 
Homme Claude RICHARD
Chef de projet NTIC
Inscription : novembre 2011
Messages : 50
Détails du profil
Informations personnelles :
Nom : Homme Claude RICHARD
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
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.
cylere est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 16h28   #9
Expert Confirmé Sénior
 
Inscription : septembre 2004
Messages : 5 092
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 5 092
Points : 7 019
Points : 7 019
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.
thelvin est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h47.


 
 
 
 
Partenaires

Hébergement Web