web-dev-qa-db-fra.com

lecture d'un fichier csv dans un tableau

J'essaie de lire le fichier csv, "read_ex.csv", dans un tableau. J'ai cherché sans fin sur le web/stackoverflow pour trouver un moyen de lire le fichier dans un tableau. Le mieux que j'ai pu faire est de le lire en streaming, mais je ne peux pas le stocker dans un tableau en raison de la taille variable du fichier. Je crois que ArrayList est une méthode pour gérer un tableau de taille variable, mais je ne sais pas comment travailler avec. Essentiellement, je veux pouvoir accéder aux "valeurs" du tableau String après la fin de la boucle while.

import Java.util.Scanner;
import Java.io.FileNotFoundException;
import Java.io.File;

public class sortarray {
     public static void main (String []agrs){
         String fileName= "read_ex.csv";
         File file= new File(fileName);


         try{
             Scanner inputStream= new Scanner(file);
             while(inputStream.hasNext()){
             String data= inputStream.next();
             String[] values = data.split(",");
             System.out.println(values[1]);
             }
             inputStream.close();
          }catch (FileNotFoundException e) {
             e.printStackTrace();
     }
     //This prints out the working directory
     System.out.println("Present Project Directory : "+ System.getProperty("user.dir"));

    }           

}
8
mikeL

Bien que l'utilisation de la bibliothèque Apache CSV mentionnée par @ Minjun.Y soit parfaitement correcte, j'essaie de fournir une solution plus proche de votre code et peut-être plus facile à suivre:

import Java.io.File;
import Java.io.FileNotFoundException;
import Java.util.ArrayList;
import Java.util.Arrays;
import Java.util.List;
import Java.util.Scanner;

public class CsvParser {

    public static void main(String[] args) {
        String fileName= "read_ex.csv";
        File file= new File(fileName);

        // this gives you a 2-dimensional array of strings
        List<List<String>> lines = new ArrayList<>();
        Scanner inputStream;

        try{
            inputStream = new Scanner(file);

            while(inputStream.hasNext()){
                String line= inputStream.next();
                String[] values = line.split(",");
                // this adds the currently parsed line to the 2-dimensional string array
                lines.add(Arrays.asList(values));
            }

            inputStream.close();
        }catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        // the following code lets you iterate through the 2-dimensional array
        int lineNo = 1;
        for(List<String> line: lines) {
            int columnNo = 1;
            for (String value: line) {
                System.out.println("Line " + lineNo + " Column " + columnNo + ": " + value);
                columnNo++;
            }
            lineNo++;
        }
    }

}

Passons en revue étape par étape:

  1. J'ai ajouté 3 autres importations: ArrayList, Arrays et List - vous verrez très bientôt ce qu'elles sont bonnes. Ils sont tous extraits de la bibliothèque Java.util, Une bibliothèque standard disponible avec chaque JDK.

  2. Chaque nom de classe en Java commence par une majuscule (par convention - il se construira également avec une petite lettre, mais vous devriez vous habituer à cette convention) - J'ai "corrigé" cela dans votre code.

  3. J'ai ajouté un tableau bidimensionnel List<List<String>> lines = new ArrayList<>(). Cela peut sembler un peu déroutant au premier abord, mais cela signifie que nous créons une variable lines qui contient les résultats de notre analyse. La syntaxe List<String> Signifie que nous avons un type génériqueList qui a un paramètre de type String - en d'autres termes: une liste de chaînes. L'ensemble List<List<String>> Signifie que nous avons une liste de listes de chaînes, un tableau de chaînes à 2 dimensions.

  4. Avec la fonction lines.add(Arrays.asList(values)) dans votre boucle while, nous pouvons ajouter les lignes que vous avez analysées à ce tableau à 2 dimensions. Arrays.asList(values) transforme le tableau String[] en List car nous en avons besoin pour être compatible avec notre type List<List<...>>. Cela permet à vos lignes d'avoir une longueur variable.

  5. Les dernières lignes que j'ai ajoutées impriment simplement le contenu d'un tableau bidimensionnel et devraient vous donner un bon exemple pour savoir comment accéder aux valeurs de ce tableau. Si vous avez besoin d'aide supplémentaire pour cette construction, consultez la documentation de la boucle foreach .

Étant donné cela comme un fichier d'entrée (read_ex.csv):

value_1-1,value_1-2,value_1-3,value_1-4
value_2-1,value_2-2,value_2-3,value_2-4
value_3-1,value_3-2,value_3-3,value_3-4
value_4-1,value_4-2,value_4-3,value_4-4
value_5-1,value_5-2,value_5-3,value_5-4

Le programme imprimera la sortie suivante:

Line 1 Column 1: value_1-1
Line 1 Column 2: value_1-2
Line 1 Column 3: value_1-3
Line 1 Column 4: value_1-4
Line 2 Column 1: value_2-1
Line 2 Column 2: value_2-2
Line 2 Column 3: value_2-3
Line 2 Column 4: value_2-4
Line 3 Column 1: value_3-1
Line 3 Column 2: value_3-2
Line 3 Column 3: value_3-3
Line 3 Column 4: value_3-4
Line 4 Column 1: value_4-1
Line 4 Column 2: value_4-2
Line 4 Column 3: value_4-3
Line 4 Column 4: value_4-4
Line 5 Column 1: value_5-1
Line 5 Column 2: value_5-2
Line 5 Column 3: value_5-3
Line 5 Column 4: value_5-4

J'espère que cela t'aides :)

17
Michael Lihs

Je suis nouveau à Java et je suis ouvert à toute méthode qui lit un csv dans un fichier qu'un débutant pourrait comprendre.

Voici une solution existante pour vous à partir du projet Apache Commons , Apache Commons CSV . Voir le Guide de l'analyseur CSV Apache Commons .

Il est très facile à utiliser hors de la boîte.

Voici un worfklow de base:

  • Créez une classe dont les champs correspondent aux colonnes du fichier csv .
  • Chaque ligne de votre csv est un objet de cette classe avec des propriétés correspondant aux champs de votre csv. Utilisez la bibliothèque pour obtenir chaque champ et le stocker dans votre objet en boucle.
  • Dans votre boucle, vous stockerez l'objet avec les champs/propriétés lus dans le csv dans ArrayList
  • Une fois la boucle terminée, votre ArrayList aura des éléments qui "correspondent" aux lignes de votre fichier csv. Vous êtes libre d'accéder à n'importe laquelle des lignes/éléments de la liste.

Si vous ne savez pas comment List et ArrayList fonctionne en Java, veuillez vous référer à peu près à tout Java tutoriels en ligne, y compris Oracle Tutorial .

Search Stackoverflow pour des centaines de messages sur l'utilisation de Commons CSV.

8
Minjun Yu