Avec java.io, le principe c'est de lire un fichier texte avec BufferedReader. Cette classe a également la méthode lines() qui retourne un Stream<String> donc le principe rese applicable. Mais peut-être n'as-tu pas vu les Stream en cours. Dans ce cas, il faut lire le fichier ligne à ligne avec un bon vieux readLine().
1 2 3 4 5 6 7
|
List<String> lines = new ArrayList<>();
try(BufferedReader reader = new BufferedReader(new FileReader( nomFichierSource ))) {
for(String line = reader.readLine(); line!=null; line = reader.readLine()) {
lines.add(line);
}
} |
Pour écrire, on peut utiliser un BufferedWriter, mais c'est plus simple d'utiliser un PrintWriter, car ses méthodes ressemblent aux méthodes qu'on utilise pour System.out.
1 2 3 4 5 6 7
| try(PrintWriter writer = new PrintWriter(new BufferedWriter(new FileWriter( nomFichierDestination )))) {
boolean first=true;
for(String line : lines) {
if ( first ) first=false; else writer.println(); // juste pour éviter qu'on ait un retour chariot après la dernière ligne
writer.print(line);
}
} |
Au niveau du traitement, il te faut pouvoir tester le contenu des lignes. Tu peux utiliser la méthode préconisée par @Bouye avec des expressions régulières. Mais comme ton format est du csv, tu peux aussi découper chaque ligne en utilisant le ; comme séparateur. S'il n'existe pas de ; dans les valeurs, tu peux utiliser String.split() facilement.
Tu peux faire le filtrage au moment où tu lis le fichier et que tu construis la liste. Mais à priori tu dois faire plusieurs fichiers en sortie. Autant lire une fois la liste et s'en servir pour chaque cas, donc en dehors de la liste de lecture
Comme tu as une ligne d'entête, il ne faut pas la traiter comme les autres. Autant l'exclure après avoir lue le fichier, ou ne pas en tenir compte à la lecture (sur le même système à base de booléen que j'ai utilisé dans la boucle d'écriture). Pour la suppression de l'entête après lecture, il suffit de simplement faire :
lines.remove(0); // supprime la ligne d'entête
Eventuellement, tu peux la stocker, ce qui peut aider pour faire d'autres traitements si nécessaire (par exemple, pour trouver les positions des colonnes par le nom) :
String[] columns = lines.remove(0).split(";"); // supprime la ligne d'entête et stocke les noms de colonnes dans un tableau
Ainsi columns[1] est le nom de la colonne 1, soit "Catégorie".
1 2 3 4 5 6 7 8 9
|
List<String[]> breuvages = new ArrayList<>();
for(String line : lines) {
String[] fields = line.split(";"); // découpe la ligne suivant les ; et récupére chaque colonne dans un tableau
if ( fields[1].equals( "Breuvages" ) { // on filtre pour ne prendre que les catégories "Breuvages"
breuvages.add(fields);
}
}
} |
1 2 3 4 5 6 7 8
|
try(PrintWriter writer = new PrintWriter(new BufferedWriter(new FileWriter( "breuvages.txt" )))) {
boolean first=true;
for(String[] fields: breuvages ) {
if ( first ) first=false; else writer.println(); // juste pour éviter qu'on ait un retour chariot après la dernière ligne
writer.print(String.join(";",fields);
}
} |
Ensuite tu dois trier la liste avant de l'exporter (d'écrire le fichier). Ce que tu peux faire avec Collections.sort(List, Comparator), en faisant un Comparator<String[]> qui va comparer les colonnes qu'il faut comparer selon le fichier voulu.
Partager