Lire un csv et le transformer en une matrice

lynajar Messages postés 2 Date d'inscription   Statut Membre Dernière intervention   -  
lynajar Messages postés 2 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour;
j'ai un fichier csv qui contient une matrice de n lignes et m colonnes de type entier, j'ai réussi a importer le fichier et lire les éléments du fichier, j'ai même calculer la moyenne d'une seul colonne,
maintenant je veux considéré le fichier comme une matrice de n lignes et m colonnes, afficher les éléments de chaque case, "values[i][j]" mais une erreur d’exécution est affiché,

erreur:
1.0
1.0
1.0
0.0
1.0
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
at pkg.MyCsvreader.main(MyCsvreader.java:28)

package pkg;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;
 
public class MyCsvreader {
	public static void main(String[] arg) {
		String fileName="exemple.csv";
		File file=new File(fileName);
		double sum=0;
		double numberOfPrices=0;
		try {
			Scanner inputStream=new Scanner(file);
			while(inputStream.hasNext()){
				String data=inputStream.next();
				String[] values=data.split(";");
				//double closingPrice=Double.parseDouble(values[3 ]);
				//sum+=closingPrice;
				//numberOfPrices++;
				//System.out.println(closingPrice);
				for(int i=0;i<values.length;i++)
				{
					for(int j=0;j<3;i++)
					{
					double v=Double.parseDouble(values[i][j]);
					System.out.println(v);
					}
				}
 
			}
			inputStream.close();
			//System.out.println("average="+(sum/numberOfPrices));
 
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
 
 
}
 
 
}


Configuration: Windows / Chrome 84.0.4147.105

3 réponses

  1. KX Messages postés 19031 Statut Modérateur 3 020
     
    Bonjour,

    Tu peux considérablement simplifier la manière dont tu lis ton fichier CSV. Exemple :

    package pkg;
    
    import java.io.IOException;
    import java.nio.file.Files;
    import java.nio.file.Paths;
    import java.util.Arrays;
    
    public class MyCsvreader {
        public static void main(final String[] arg) throws IOException {
            String[][] matrix = Files.lines(Paths.get("exemple.csv"))
                                     .map(line -> line.split(";"))
                                     .toArray(String[][]::new);
            System.out.println(Arrays.deepToString(matrix));
        }
    }
    0
  2. lynajar Messages postés 2 Date d'inscription   Statut Membre Dernière intervention  
     
    Bonjour;
    merci KX pour ton aide,
    je veux utiliser les éléments de chaque case pour faire des calcules, par exemple calculer la somme de tous les éléments de la matrice:

    som=0;
    for(i=0;i<n;i++)
    for(j=0;j<m;j++)
       som=som+matrix[i][j]
    end
    end
    0
    1. KX Messages postés 19031 Statut Modérateur 3 020
       
      Il suffit d'une légère adaptation de mon code pour obtenir un double[][] plutôt qu'un String[][] par exemple :
      double[][] matrix = Files.lines(Paths.get("exemple.csv"))
                               .map(line -> Arrays.stream(line.split(";"))
                                                  .mapToDouble(Double::parseDouble)
                                                  .toArray())
                               .toArray(double[][]::new);

      Toutefois, tu pourrais très facilement calculer directement la somme, sans avoir à passer par une matrice :
      double sum = Files.lines(Paths.get("exemple.csv"))
                        .flatMap(line -> Arrays.stream(line.split(";")))
                        .mapToDouble(Double::parseDouble)
                        .sum();
      0
  3. lynajar Messages postés 2 Date d'inscription   Statut Membre Dernière intervention  
     
    Bonsoir;
    je dois passer par une matrice pour utiliser la valeur de chaque case ligne i et colonne j (matrix[i][j]) séparément, parce que par la suite je veux utiliser cette matrice pour créer un arbre
    0