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"));
}
}
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:
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.
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.
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.
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.
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 :)
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:
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.