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

Collection et Stream Java Discussion :

Interpreter un fichier .txt pour ajouter le contenu dans un array[][][]


Sujet :

Collection et Stream Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2010
    Messages : 39
    Points : 39
    Points
    39
    Par défaut Interpreter un fichier .txt pour ajouter le contenu dans un array[][][]
    Bonjour,
    Besoin d'aide pour interpreter un fichier .txt en java.

    Alors voici mon script:
    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
     
    	public static void lireFichier() {
    		String nomFichier;
    		Scanner sc = new Scanner(System.in);
     
     
    		Boolean fichierErreur = false ;
    		while (fichierErreur == false) {
    			System.out.println("Veuillez fournir le nom du fichier:");
    			nomFichier = sc.next();
    		try {
     
    			File fichierALire = new File(nomFichier);
    			FileReader unFichier = new FileReader(fichierALire);
    			BufferedReader leBuffer = new BufferedReader(unFichier);
    			fichierErreur = true;
     
    			try {
    				System.out.println("Fichier charge! ");
    				System.out.println("-------------------------------------------------------------------------------");
                    String uneligne = leBuffer.readLine();
                    while (uneligne != null) {
                        System.out.println(uneligne);
                        uneligne = leBuffer.readLine();
                    }
                    System.out.println("-------------------------------------------------------------------------------");
                    leBuffer.close();
                    unFichier.close();
     
                } catch (IOException exception) {
                    System.out.println("Il y a une erreur lors de la lecture: " + exception.getMessage());
                }
    		} catch (FileNotFoundException exception) {
                System.out.println("Erreur, fichier inexistant!");
                fichierErreur = false;
    	}
    		}
    }
    mes fichier.txt doivent absolument avoir la forme suivan
    014 023 037 069 088 125 143 211 263 306 342 357 404 427 461 483 535 544 589 622 673 745 764 805 824 851 862 876

    ce qui représente des case dans un sudoku. 014 = ligne 0, colonne 1, valeur 4
    Je dois donc lire les donnée et pour chaque serie de 3 chiffres (xyz), et les intégrer dans un array[x][y][z]

    Alors comment lire chaque bloque de 3 caractere pour les convertir en int et ajouter dans mon array...?

    Merci

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2010
    Messages : 39
    Points : 39
    Points
    39
    Par défaut
    Alors voici le développement, mais ca ne fonctionne pas!!

    Nous avons ici ma methode lireFichier, elle est conçu pour lire le fichier "partie1.txt" caractère par caractère et ensuite tout afficher d'une ligne. par le même temps, on place dans les variable x, y et z avec la méthode iGrille.setPlacement( int x, int y, int z). mais ca ne semble pas fonctionné, j'obtien une erreur et je n'arrive pas a corriger.

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    public static void lireFichier() {
    		String nomFichier = "partie1.txt";
    		Scanner sc = new Scanner(System.in);
    		int grille = 0;
    		Grille iGrille = new Grille();
    		int x=0;
        	int y=0;
        	int z=0;
     
     
    		Boolean fichierErreur = false ;
    		while (fichierErreur == false) {
    			System.out.println("Veuillez fournir le nom du fichier:");
    			//nomFichier = sc.next();
     
    		try {
     
    			File unFichier = new File(nomFichier);
    			FileReader fichierALire = new FileReader(unFichier);
     
    			fichierErreur = true;
     
    			try {
    				System.out.println("Fichier charge! ");
    				System.out.println("-------------------------------------------------------------------------------");
    				int c = fichierALire.read();
                    while (c != -1) {
     
                    	System.out.print((char) c);
                    	grille = c;
                    	x = (char) c;
                    	c = fichierALire.read();
                    	System.out.print((char) c);
                    	y = (char) c;
                    	c = fichierALire.read();
                    	System.out.print((char) c);
                    	z = (char) c;
                    	c = fichierALire.read();
                    	iGrille.setPlacement(x, y, z); // ICI il y un problème et java m'affiche "Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 56"
     
     
     
                    }
                    System.out.println("\n-------------------------------------------------------------------------------");
     
                    fichierALire.close();
     
                } catch (IOException exception) {
                    System.out.println("Il y a une erreur lors de la lecture: " + exception.getMessage());
                }
    		} catch (FileNotFoundException exception) {
                System.out.println("Erreur, fichier inexistant!");
                fichierErreur = false;
    	}
    		}
     
    }
    ici nous avons ma class Grille afin que vous puissier voir ma méthode setPlacement:

    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
     
    public class Grille {
    	public int[][] board = new int[9][9];
    	int Line;
    	int Row;
    	int Value;
     
    	public int getLine() {
    		return Line;
    	}
     
    	public int getRow() {
    		return Row;
    	}
     
    	public int getValue() {
    		return Value;
    	}
     
    	public void setPlacement(int x, int y, int z) {
    		this.Line = x;
    		this.Row = y;
    		this.Value = z;
    		board[x][y]=z;
    	}

  3. #3
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Les valeurs des caractères ne correspondent pas aux valeurs numériques. Autrement dit System.out.println(((int)'0')); affiche 48 et non pas 0. Tu pourrais t'en sortir en faisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int c = fichierALire.read();
    if ( c!=' ' ) { // c'est une espace, on ne traite pas
      int nombre = c-'0'; // le chiffre c'est le code du caractère - le code du '0' (on peut faire ça parce que les codes des caractères de 0 à 9 se suivent
    }
    Pour lire tes séquences de chiffres en char, tu peux faire, plus simplement, et avec une meilleure gestion des "close" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Files.lines(Paths.get(fichier)) // on récupère les lignes du fichier
         .map(line-> line.split(" ")) // on les découpe en morceaux (tableau) en utilisant l'espace comme séparateur
         .flatMap(Arrays::stream) // on converti le tableau en stream
         .map(String::toCharArray) // on récupère les chars de chaque morceau
         .forEach(chararray-> {
                        int[] array=new int[chararray.length];
                        for(int i=0; i<chararray.length; i++) {
                            array[i]=chararray[i]-'0'; // on converti chaque char en int
                        }
                        iGrille.setPlacement(array[0], array[1], array[2]);
                 });

    Ou, encore plus simple, avec un Scanner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    try (Scanner scanner = new Scanner(Paths.get(fichier))) { // try-with-resource : pas besoin de close explicite (le close est implicite)...
        while (scanner.hasNext()) {
            char[] chararray = scanner.next().toCharArray();
            int[] array = new int[chararray.length];
            for (int i = 0; i < chararray.length; i++) {
                array[i] = chararray[i] - '0'; // on converti chaque char en chiffre int
            }
            iGrille.setPlacement(array[0], array[1], array[2]);
        }
    }
    Ou en int :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    try (Scanner scanner = new Scanner(Paths.get(fichier))) {
        while (scanner.hasNextInt()) { // tant qu'il y a des int à lire
            int n=scanner.nextInt(); // on lit le prochain int
            int x = n/100; // division entière !
            n=n%100; // reste de la division entière
            int y = n/10; 
            int z=n%10; 
            iGrille.setPlacement(x, y, z);
        }
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2010
    Messages : 39
    Points : 39
    Points
    39
    Par défaut
    Merci pour le hint sur les char,

    maintenant un autre problème se pose pour ma même fonction:
    ma méthode fonctionne si je l'appel dans mon main, mais pas si je l'appel depuis ma methode lireFichier()

    voici une mise à jour de lireFichier() avec quelque test a l'intérieur qui seront a effacer

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    public static void lireFichier() {
    		String nomFichier = "partie1.txt";
    		Scanner sc = new Scanner(System.in);
    		//int grille = 0;
    		Grille iGrille = new Grille();
    		int x=0;
        	        int y=0;
        	        int z=0;
     
     
    		Boolean fichierErreur = false ;
    		while (fichierErreur == false) {
    			System.out.println("Veuillez fournir le nom du fichier:");
    			//nomFichier = sc.next();
     
    		try {
     
    			File unFichier = new File(nomFichier);
    			FileReader fichierALire = new FileReader(unFichier);
     
    			fichierErreur = true;
     
    			try {
    				System.out.println("Fichier charge! ");
    				System.out.println("-------------------------------------------------------------------------------");
    				int c = fichierALire.read();
                    while (c != -1) {
                    	//int x;
                    	//int y;
                    	//int z;
                    	System.out.print((char) c);
                    	//grille = c;
                    	x = c - '0';
                    	c = fichierALire.read();
                    	System.out.print((char) c);
                    	y = c - '0';
                    	c = fichierALire.read();
                    	System.out.print((char) c);
                    	z = c - '0';
                    	c = fichierALire.read();
                    	//iGrille.setPlacement(Character.digit(x, 10), Character.digit(y, 10), Character.digit(z, 10));
                    	//Character.dig
     
     
     
                    }
                    System.out.println("\n-------------------------------------------------------------------------------");
     
                    fichierALire.close();
                    //System.out.println((char)grille);
                    System.out.println(Character.digit(x, 10));
                    iGrille.setPlacement(x, y, z);
                    int x1 = 8;
                    int y1 = 7;
                    int z1 = 6;
                    iGrille.setPlacement(x1, y1, z1);
     
                } catch (IOException exception) {
                    System.out.println("Il y a une erreur lors de la lecture: " + exception.getMessage());
                }
    		} catch (FileNotFoundException exception) {
                System.out.println("Erreur, fichier inexistant!");
                fichierErreur = false;
    	}
    		}
    		//iGrille.setPlacement(Character.digit(x, 10), Character.digit(y, 10), Character.digit(z, 10));
    		//iGrille.setPlacement(Character.getNumericValue(x), Character.getNumericValue(y), Character.getNumericValue(z));
    }
    ici nous avons ma méthode setPlacement:
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
                   public class Grille {
    	//public int[][] board = new int[9][9];
    	int Line;
    	int Row;
    	int Value;
     
    	public int[][] board = 
    			{{0,0,4,8,0,6,9,1,7},
    	        {0,0,0,1,4,9,2,0,5},
    	        {1,0,9,5,0,7,4,0,8},
    	        {4,3,6,7,9,0,0,2,1},
    	        {0,0,2,4,6,1,0,9,3},
    	        {9,1,0,2,0,3,0,4,6},	
    	        {2,8,1,6,7,4,3,5,9},
    	        {7,9,5,3,1,2,6,8,4},
    	        {6,4,3,9,0,0,1,7,2}};
     
    	public int getLine() {
    		return Line;
    	}
     
    	public int getRow() {
    		return Row;
    	}
     
    	public int getValue() {
    		return Value;
    	}
     
    	public void setPlacement(int x, int y, int z) {
    		this.Line = x;
    		this.Row = y;
    		this.Value = z;
    		board[x][y]=z;
    		System.out.println(board[x][y]);
    		System.out.println("ligne; " + x + " colonne; " + y + " Valeur; " + z);
    	}		
     
    	public void printGrille() {
    	    for (int i = 0; i < 9; i++) {
    	            System.out.print("\n");
    	            if(i%3==0)
    	                System.out.print("\n");
    	        for (int j = 0; j < 9; j++) {
    	            if (j % 3 == 0)
    	                System.out.print(" ");
    	            if (board[i][j] == 0)
    	                System.out.print(". ");
    	            if (board[i][j] == 1)
    	                System.out.print("1 ");
    	            if (board[i][j] == 2)
    	                System.out.print("2 ");
    	            if (board[i][j] == 3)
    	                System.out.print("3 ");
    	            if (board[i][j] == 4)
    	                System.out.print("4 ");
    	            if (board[i][j] == 5)
    	                System.out.print("5 ");
    	            if (board[i][j] == 6)
    	                System.out.print("6 ");
    	            if (board[i][j] == 7)
    	                System.out.print("7 ");
    	            if (board[i][j] == 8)
    	                System.out.print("8 ");
    	            if (board[i][j] == 9)
    	                System.out.print("9 ");
    	        }
    	    }
    	    System.out.print("\n\n");
    	}
     
    }
    puis ici ma main qui est dans la class Test tout comme lireFichier()

    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
     
    public static void main(String[] argv) {
    		int x = 8;
    		int y = 7;
    		int z = 6;
     
    		System.out.println("*************************************Sudoku***********************************");
    		System.out.println("Bienvenue dans le programme de Sudoku, ce programme ...\n");
    		affichageMenu();
    		Grille iGrille = new Grille();
    		iGrille.printGrille();
    		iGrille.setPlacement(x, y, z);
    		iGrille.printGrille();
     
    	}
    alors dans lireFichier() j'appel iGrille.setPlacement(x, y, z) puis ça me retourn bien la valeur ainsi que l'emplacement, par contre si j'imprime ma grille, le placement n'a pas été fait, ma valeur dans l'emplacement du dernier placement (8, 7, 6) reste inchangé.
    cependant en testant mon script j'ai ajouté dans mon main le même placement iGrille.setPlacement(x, y, z) avec les même valeur et ça fonctionne.

    Pourquoi ca ne fonctionne pas dans lireFichier() et ca fonctionne dans mon main?
    Je n'ai pas encore tester tout le reste je viens de me remettre au boulot! Merci beaucoup de ton aide.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2010
    Messages : 39
    Points : 39
    Points
    39
    Par défaut
    Finalement tout fonctionne très bien! un gros merci! j'ai un autre petit soucis, mais concernant un autre sujet alors j'ouvrirai une autre discussion si je ne trouve pas.
    Ce qui ne fonctionnait pas c'est à cause de ma déclaration de mon board[][], d'ailleurs c'est la dessus mon nouveau problème, il me manque des notions concernant la déclaration de variable dans d'autre class qui ne sont pas mon main et pourquoi elle retombe toujours à 0...
    Merci beaucoup de l'aide.

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 25/02/2014, 20h22
  2. récupéré une ligne dans un fichier txt pour mettre dans msgbox
    Par fabrice44 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 04/02/2008, 14h01
  3. Réponses: 5
    Dernier message: 03/12/2007, 23h45
  4. Lire un fichier .txt et exploiter son contenu
    Par berberat dans le forum MATLAB
    Réponses: 5
    Dernier message: 07/08/2007, 11h38
  5. Réponses: 8
    Dernier message: 08/03/2007, 16h54

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