[Java] Problème de tableau

Résolu/Fermé
valentin2703 Messages postés 180 Date d'inscription dimanche 30 janvier 2011 Statut Membre Dernière intervention 30 septembre 2012 - 3 mai 2011 à 12:50
KX Messages postés 16760 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 12 février 2025 - 4 mai 2011 à 12:37
Bonjour,

Je doit récupérer des informations dans un fichier texte, pour cela j'utilise la méthode split.
Le fichier texte ressemble à cela :

* GigabitEthernet1/1
* GigabitEthernet1/2
* GigabitEthernet2/1

et dedans je ne souhaite récupérer que les GigabitEthernetx/x, je fait donc :

try{
     BufferedReader lire = new BufferedReader(new FileReader("C:/Essaie.txt"));
     String line;
     while ((line = lire.readLine())!= null){
          String[] decompose = line.split(" +");
	  System.out.println(decompose[1]);
     }
     lire.close();
     }catch(IOException z){
          System.exit(0);
     }


Mais quand je lance le code je me retrouve avec ceci :

GigabitEthernet1/1
java.lang.ArrayIndexOutOfBoundsException: 1

L'affichage du premier GigabitEthernet marche bien, mais le reste bloque ^^"

A voir également:

4 réponses

valentin2703 Messages postés 180 Date d'inscription dimanche 30 janvier 2011 Statut Membre Dernière intervention 30 septembre 2012 9
3 mai 2011 à 13:42
Je tien a préciser que lorsque que je lui demande d'afficher decompose[0], il affiche bien les 3 étoiles.
0
poukkid Messages postés 106 Date d'inscription mercredi 20 mai 2009 Statut Membre Dernière intervention 11 avril 2012 11
Modifié par poukkid le 3/05/2011 à 15:21
J'ai testé chez moi et ca fonctionne tres bien, même si je ne comprend pas à quoi sert le + dans le split(" +"), avec ou sans le + en tout cas ca fonctionne bien.
Le probleme doit venir de ton fichier. Ya t'il une ligne vide entre tes * Giabit... ?
ou bien un caractère spécial?
Si une ligne ne te permet d'avoir qu'une seule case dans ta variable decompose, alors decompose[1] t'amenera cette renverra cette erreur.
0
valentin2703 Messages postés 180 Date d'inscription dimanche 30 janvier 2011 Statut Membre Dernière intervention 30 septembre 2012 9
3 mai 2011 à 16:34
Le + signifie : un espace ou plus.
Alors ce fichier n'est pas le vraie que je récupère, j'ai en effet remarquer que quand je le crée moi même cela marche très bien, par contre quand je prend le fichier récupéré sur le switch, ça plante ^^
0
KX Messages postés 16760 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 12 février 2025 3 020
3 mai 2011 à 23:31
Pour une expression régulière, "un espace ou plus" devrait être "[\\s]+"
0
bzkr7 Messages postés 22 Date d'inscription vendredi 7 décembre 2007 Statut Membre Dernière intervention 1 mars 2012 2
3 mai 2011 à 22:26
Je te propose la solution suivante en utilisant des ArrayList et on changeant la syntaxe du fichier texte.

Pour le fichier Texte il faut que tes instructions soient écrit de cette façon La;

GigabitEthernet1/1
GigabitEthernet1/2
GigabitEthernet2/1

JE TE CONSIELLE d'utiliser bloc note pour l édition du fichier texte
Ensuite puisque on lit notre fichier ligne par ligne donc on qu'a stocker chaque line dans notre ArrayList.

Le Code JAVA est :

try{
BufferedReader lire = new BufferedReader(new FileReader("C:/algotest.txt"));

ArrayList decompose = new ArrayList();
int i=0;
String str=null;

while ((str=lire.readLine())!= null){

decompose.add(str);
System.out.print(decompose.get(i).toString()+"\n");
i++;
}
lire.close();
}catch(IOException z){
System.exit(0);
}



" Si tu as de nombreuses richesses, donne de ton bien ; si tu possèdes peu, donne de ton coeur. "
0
bzkr7 Messages postés 22 Date d'inscription vendredi 7 décembre 2007 Statut Membre Dernière intervention 1 mars 2012 2
3 mai 2011 à 22:28
Remarque : ne pas oublier de changer le nom du fichier texte dans le programme "algotest.txt"
0
valentin2703 Messages postés 180 Date d'inscription dimanche 30 janvier 2011 Statut Membre Dernière intervention 30 septembre 2012 9
4 mai 2011 à 08:23
Merci pour ta solution, j'arrive bien a lire le fichier texte. Sauf que moi je ne souhaite récupéré que les GigabitEthrnet. Je ne peut pas me permettre de l'éditer à la main, cela doit ce faire de façons automatique.
0
KX Messages postés 16760 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 12 février 2025 3 020
4 mai 2011 à 00:01
Voici une manière de faire, sans avoir à modifier ton fichier...
import java.io.File;
import java.io.FileNotFoundException;

import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;

public class Test 
{    
    public static void main(String[] args) throws FileNotFoundException
    {
        List<String> liste = new LinkedList<String>();
        
        Scanner sc = new Scanner(new File("C:\\Essaie.txt")).useDelimiter("[\\s*]+");
        
        while(sc.hasNext())
            liste.add(sc.next());    
        
        sc.close();
        
        String[] decompose = liste.toArray(new String[liste.size()]);
        
        for (String s : decompose)
            System.out.println(s);        
    }
}
0
valentin2703 Messages postés 180 Date d'inscription dimanche 30 janvier 2011 Statut Membre Dernière intervention 30 septembre 2012 9
4 mai 2011 à 08:27
J'aime bien ta solution KX, comment je doit faire si je veut préciser que seul le GigabitEthernet m'intéresse ?
0
KX Messages postés 16760 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 12 février 2025 3 020
4 mai 2011 à 09:31
Je croyais que tu voulais GigabitEthernetx/x mais si tu ne veux que GigabitEthernet, tu peux mettre :
useDelimiter("[\\W\\d]+")
0
valentin2703 Messages postés 180 Date d'inscription dimanche 30 janvier 2011 Statut Membre Dernière intervention 30 septembre 2012 9
4 mai 2011 à 09:56
Oui enfin je veut le x/x avec ^^ C'est juste que dans le fichier il n'y a pas que :
* GigabitEthernetx/x sur la ligne.
0
KX Messages postés 16760 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 12 février 2025 3 020
4 mai 2011 à 12:37
Alors donne moi un exemple complet de fichier, peut-être qu'il vaudrait mieux utiliser un pattern sur les éléments plutôt que sur le délimiteur (ou une combinaison des deux)

String pattern1,pattern2;

sc.useDelimiter(pattern1);

while (sc.hasNext(pattern2))
    liste.add(sc.next(pattern2));
0