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

Langage Java Discussion :

Découper un chaîne selon un nombre Maxi de caractères


Sujet :

Langage Java

  1. #1
    Membre habitué Avatar de cashmoney
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 298
    Points : 149
    Points
    149
    Par défaut Découper un chaîne selon un nombre Maxi de caractères
    Bonjour Débutant en java, j'aimerais découper ma chaine de caractère selon le caractère poin "." et aussi selon le nombre de caractère qu'elle contient, le mien doit contenir 6 caractère au maximum sinon si nous rencontrons un point "." avant les 6 caractère bas on découpe quand même.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    String[] découpé = "boo.and.foo".split(".");
    // découpé[0] = "boo", découpé[1] = "and" et découpé[2] = "foo"
     
    ================================
    int MAXCAR = 6;
    String[] tronk = new String[MAXCAR];
     
    for (int i =0; i > MAXCAR-1; i++)
    			{
    			tronk = chaine.split(".");
    			System.out.println("tronk["+i+"] " + tronk[i]);
    			}
    //Ce code ne m'affiche pas le le contenu de tronk[i];
    pour découper selon le nombre max de caractère, je n'arrive pas. je pense qu'avec le machaine.lenght(), il y a moyen, mais dur dur de trouver la syntaxe appropriée.

    Merci

  2. #2
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 607
    Points : 15 652
    Points
    15 652
    Par défaut
    Le problème vient du fait que split utilise les expression régulière. le caractère . ayant la signification de "n'importe quel caractère" dans une expression régulière.

    Ton code peut être grandement simplifié.
    - le plus simple pour récupérer une partie d'une chaine la méthode est substring().
    - pour connaitre la position d'un caractère dans la chaine, c'est indexOf().

    Dans ton cas il faudrait faire quelquechose du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int index = chaine.indexOf(".");
    if (index==-1) index = chaine.length(); //prendre toute la chaine si pas de "."
    if (index>6) index=6; //prendre 6 caractères, si plus de 6 caractères.
    String resultat = chaine.substring(0,index);

  3. #3
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Points : 3 938
    Points
    3 938
    Par défaut
    Voila ton code retouché,il marche comme tu le voulais :
    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
    String[] découpé = "boo.and.foo".split(".");
    		// découpé[0] = "boo", découpé[1] = "and" et découpé[2] = "foo"
     
     
    		int MAXCAR = 6;
    		String[] tronk; //= new String[MAXCAR];
    		String chaine="boo.and.foo";
    		tronk = chaine.split("\\.");
    		int tailleMax=(tronk.length>6)?MAXCAR:(tronk.length);
    		System.out.println(tronk.length);
    		for (int i =0; i < tailleMax; i++)
    					{
    					System.out.println("tronk["+i+"] " + tronk[i]);
    					}
    		//Ce code ne m'affiche pas le le contenu de tronk[i];
    Il y'avait plusieurs erreurs:
    -Le "." est un caractere spécial en java, il fallait l'echapper
    -Dans la boucle "for" l'instruction du milieu c'est la condition de validité de la boucle
    -Je t'ai également mis une condition Max qui est fonction de la taille MAXCAR et du nombre de mots séparés par des "."
    Ca devrait te debloquer

  4. #4
    Membre habitué Avatar de cashmoney
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 298
    Points : 149
    Points
    149
    Par défaut
    Merci à vous les gars vous êtes géniaux. j'ai essayer de griffoner une fonction tronque, qui découpe quand le caractère est trop long et lui rajoute un point à la fin.
    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
     
    static String tronque(String str, int MAXCAR ) 
    	{ 
    	String text;
    	int poSpace;
    	// Si le nombre de caractères présents dans la chaine 
                 //est supérieur au
    	// nombre
    	// maximum, alors on découpe la chaine au nombre de caractères
    	if (str.length() > MAXCAR ) 
    	{ 
    str = str.substring( 0, MAXCAR ); 
    poSpace = str.indexOf(" "); // on récupère l'emplacement du dernier
    									// espace dans la chaine, pour ne pas
    									// découper un mot.
    text = str.substring(0, poSpace); // on redécoupe à la fin du   
                //dernier mot
    str = str.concat("."); // puis on rajoute un .
    	} 
    	return str; // on retourne la variable modifiée
    	}
    Je vous le soumet pour avoir des avis et si possible des corrections
    Merci

  5. #5
    Membre habitué Avatar de cashmoney
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 298
    Points : 149
    Points
    149
    Par défaut
    Merci à vous les amis je teste le tout, mais regarder ma fonction.

  6. #6
    Membre habitué Avatar de cashmoney
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 298
    Points : 149
    Points
    149
    Par défaut
    DevServlet Voila ton code retouché,il marche comme tu le voulais :


    DevServlet, j'ai testé ton code, il marche quand j'ai un point au mileu de ma chaine,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Entrer votre chaîne de caractère en terminant par un point '.' : azer.tyuio
     tronk.length 2
    tronk[0] azer
    tronk[1] tyuio
     
     votre chaîne de caractère ne contenait pas de point '.' à la fin
    azer.tyuio.
    mais quand la chaîne dépasse 6 caractère, il ne la découpe pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     Entrer votre chaîne de caractère en terminant par un point '.' : azertyuiopqsd
     tronk.length 1
    tronk[0] azertyuiopqsd
     
     votre chaîne de caractère ne contenait pas de point '.' à la fin
    azertyuiopqsd.
    Je vais essayer de fusionner ton et celui de Uther et on verra ce que ça va donner. Merci

  7. #7
    Membre habitué Avatar de cashmoney
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 298
    Points : 149
    Points
    149
    Par défaut
    DevServlet, je continue les tests avec tes codes et je vois que tu as tout renversé. Le nombre maxi de séparateur est égale à 6 alors que ce que je voulais c'est découper dès que les caractères de ma chaîne sont supérieur à 6 ou si l'on rencontre un point .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    MAXCAR = 6
    tronk = chaine.split("\\.");
    index = (tronk.length > 6) ? MAXCAR : (tronk.length);
    tronk.length > 6; 
    // ce n'est pas ça je voulais
    ***********************************************
    //je voulais ce qui est en dessous
     
    if (machaine.length() > MAXCAR) || (point = machaine.indexOf('.')); 
    // découper si machaine est supérieur à 6 
    //ou 
    //si je rencontre un point dans machaine.
    Mon soucis, vue que je suis débutant, pas facile de mettre en code le découpage.

    Merci pour votre aide.

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 268
    Points : 199
    Points
    199
    Par défaut
    Ce que tu veux n'est pas très clair. Tu veux d'abord couper aux ".", puis ensuite à 6 caractères maximum, ou le contraire ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    "abcdefg.h.ijklmno.p"
    = "abcdefg", "h", "ijklmno", "p" // D'abord par les points
    = "abcdef","g","h","ijklmn","o","p"// Ensuite 6 caractères max
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    "abcdefg.h.ijklmno.p"
    = "abcdef", "g.h.ij", "klmno.", "p" // D'abord tous les 6 caractères
    = "abcdef","g","h","ij","klmno","p"// Ensuite par point
    Dans les 2 cas, pour moi, le plus simple serait de passer par une list, remplie par un traitement puis par l'autre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    String test = "abcdefg.h.ijklmno.p";
    String[] point = test.split("\\.");
    ArrayList résultat = new ArrayList();
    for ( int i=0; i< point.length; i++ ) {
      if (point[i].length > 6) {
        résultat.add(point[i].substring(0,6));
        résultat.add(point[i].substring(6)); // Si tu veux garder les caractères > 6
      }
      else
        résultat.add(point[i]);
    }
    Cet exemple est pour le premier cas (on découpe par point, et ensuite on découpe tous les 6 caractères). J'espère que ça t'aidera !

    A noter que les expressions régulière sont peut être une solution (séparé par un "\\." ou tous les 6 caractères), mais je ne connais pas assez ce domaine

  9. #9
    Membre habitué Avatar de cashmoney
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 298
    Points : 149
    Points
    149
    Par défaut
    je veux couper aux 6 caractères maximum mais si je trouve un point avant les 6 caractères, je coupe. voilà raison pour laquelle j'ai utilisé l'opérateur booléen ||.

    Sinon, si l'opérateur n'utilise jamais de point dans la chaîne de caractère, notre programme doit le couper après 6 caractères rencontrés.

    JohnNC, j'ai testé ton programme et il me retourne des booléen est affichage. il nous montre la découpe, mais le contenu des tableaux sont en booléen

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Entrer votre chaîne de caractère en terminant par un point '.' : azert.azertyu.azertik
    tronk[0] true
    tronk[1] true
    tronk[1] true
    tronk[2] true
    tronk[2] true
     
     *** Tapez ENTREE pour terminer ***

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 268
    Points : 199
    Points
    199
    Par défaut
    Je viens de tester (en corrigeant le length()), et j'obtiens "[abcdef, g, h, ijklmn, o, p]" dans l'ArrayList
    Peux tu mettre le code ?

  11. #11
    Membre habitué Avatar de cashmoney
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 298
    Points : 149
    Points
    149
    Par défaut
    OK, je te met d'abords mon code que j'ai élaboré avec l'aide du petit exemple de Uther et j'ai ça. et ce tout, je veux le mettre dans dans un tableau comme tu l'as fait :

    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
    40
    41
     
     
    int pos;
    String chaine, s;
     
    System.out.print("Entrer votre chaîne de caractère en terminant par un point '.' : ");
    Scanner sc = new Scanner(System.in);
    chaine = sc.nextLine();
    chaine = chaine.trim();
    // élimine tous les espaces avant et après
    // la chaîne
    pos = chaine.indexOf(".");
    if ((pos != -1) && (pos < MAXCAR)) 
    // si notre chaine contient un point
    //et la position est supérieur au MAX
    // on attribue la position de fin à la
    // position du point
    {
    s = chaine.substring(0, pos).concat(".");
    System.out.println(s);
    }
     
    else if ((pos > MAXCAR) && (chaine.length() > MAXCAR)) // si la
    // longueur de ma chaîne est
    // supérieur au maxi
    // et si la position de notre point est supérieur au maxi
    // prendre seulement le MAX
    {
    pos = MAXCAR;
    s = (chaine.substring(0, pos)).concat(".");
    System.out.println(s);
    }
    else if ((pos == -1) && (chaine.length() < MAXCAR)) 
    // si notre chaine ne contient
    // pas de point
    {
    pos = chaine.length();
    System.out.println();
    s = (chaine.substring(0, pos)).concat(".");
    System.out.println(s);
    }
    Et ensuite je te met le code avec ton exemple intégrer :

    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
     
    String chaine;
     
    System.out.print("Entrer votre chaîne de caractère en terminant par un point '.' : ");
    Scanner sc = new Scanner(System.in);
    chaine = sc.nextLine();
    chaine = chaine.trim();
    String[] point = chaine.split("\\.");
    ArrayList résultat = new ArrayList();
    for ( int i=0; i< point.length; i++ ) {
    if (point[i].length() > 6) {
    résultat.add(point[i].substring(0,6));
    résultat.add(point[i].substring(6)); // Si tu veux garder les caractères > 6
    System.out.println("tronk["+i+"] " + résultat.add(point[i]));
    }
    else
     résultat.add(point[i]);
    System.out.println("tronk["+i+"] " + résultat.add(point[i]));
    }

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 268
    Points : 199
    Points
    199
    Par défaut
    arrayList.add() retourne un boolean (indiquant si l'ajout de l'élément a été effectué). Il faut soit afficher le résultat au fur et à mesure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if (point[i].length() > 6) {
    System.out.println(point[i].substring(0,6));
    System.out.println(point[i].substring(6)); // Si tu veux garder les caractères > 6
    }
    else
     System.out.println(point[i]);
    }
    Mais dans ce cas, la partie "tronk[i]" ne sert à rien.

    Soit il faut, à la fin du traitement, transferer la liste dans un nouveau tableau de String
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String[] tronk = résultat.toArray(new String[résultat.size()]);
    Auquel cas tu pourras faire ensuite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for ( int i =0; i < tronk.length; i++ )
      System.out.println("tronk["+i+"] = "+tronk[i]);

  13. #13
    Membre habitué Avatar de cashmoney
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 298
    Points : 149
    Points
    149
    Par défaut
    Ok, cool. ça fonctionne avec quelques modifs. je garde ça en archive dans mes codes. Merci de ton aide, c'est vraiment sympa

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 268
    Points : 199
    Points
    199
    Par défaut
    Y'a pas de quoi

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/01/2015, 11h42
  2. nombre maxi de caractères
    Par NicolasMO dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 15/09/2007, 21h48
  3. tri selon le nombre d'enregistrement
    Par bugbug dans le forum Requêtes
    Réponses: 2
    Dernier message: 27/12/2005, 13h57
  4. Comment découper une chaîne de caractères en VBA
    Par TomPad dans le forum Access
    Réponses: 3
    Dernier message: 23/06/2005, 09h58
  5. Découper une chaîne de la droite
    Par Gourouni dans le forum ASP
    Réponses: 4
    Dernier message: 10/03/2005, 11h38

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