[JAVA] Extraire des lignes d'un fichier texte
Résolu
Bonjour,
Je suis actuellement en train d'essayer de récupérer des lignes d'un fichier texte.
Je récupère un fichier texte d'un switch :
GigabitEthernet1/1 is up, line protocol is up (connected)
Hardware is Gigabit Ethernet Port, address is 0022.5512.7b00 (bia 0022.5512.7b00)
Description: fr-scle-0x2-spare2
MTU 1500 bytes, BW 1000000 Kbit, DLY 10 usec,
reliability 255/255, txload 1/255, rxload 1/255
Encapsulation ARPA, loopback not set
Keepalive set (10 sec)
Full-duplex, 1000Mb/s, link type is auto, media type is 1000BaseSX
input flow-control is on, output flow-control is on
ARP type: ARPA, ARP Timeout 04:00:00
Last input 00:00:01, output never, output hang never
Last clearing of "show interface" counters never
Input queue: 0/2000/0/0 (size/max/drops/flushes); Total output drops: 0
Queueing strategy: fifo
Output queue: 0/40 (size/max)
5 minute input rate 1000 bits/sec, 3 packets/sec
5 minute output rate 1000 bits/sec, 1 packets/sec 158750283 packets input, 52415245126 bytes, 0 no buffer
Received 99952970 broadcasts (50134602 multicasts)
0 runts, 0 giants, 0 throttles
0 input errors, 0 CRC, 0 frame, 0 overrun, 0 ignored
0 input packets with dribble condition detected
3605845 packets output, 299411824 bytes, 0 underruns
0 output errors, 0 collisions, 0 interface resets
0 babbles, 0 late collision, 0 deferred
0 lost carrier, 0 no carrier
0 output buffer failures, 0 output buffers swapped out
Mais les deux seules lignes qui m'intéresses sont celles que j'ai mises en gras.
J'ai donc commencer a réaliser un petit programme en Java, mais pour l'instant il ne fait que lire ligne par ligne mon fichier texte, auriez vous des idées pour extraires ces deux lignes ?
Voici mon fichier Java tel qu'il est pour l'instant :
import java.io.*;
import java.util.*;
class Lecture{
public static void main(String[] args){
String filePath = "Charge-fr-scle-0x2-spare1.txt";
try{
BufferedReader buff = new BufferedReader(new FileReader(filePath));
try {
String line;
// Lire le fichier ligne par ligne
// La boucle se termine quand la méthode affiche "null"
while ((line = buff.readLine()) != null) {
System.out.println(line);
}
buff.close(); //Lecture fini donc on ferme le flux
}
catch (IOException e){
System.out.println(e.getMessage());
System.exit(1);
}
}
catch (IOException e) {
< System.out.println(e.getMessage());
System.exit(1);
}
}
}
Je suis actuellement en train d'essayer de récupérer des lignes d'un fichier texte.
Je récupère un fichier texte d'un switch :
GigabitEthernet1/1 is up, line protocol is up (connected)
Hardware is Gigabit Ethernet Port, address is 0022.5512.7b00 (bia 0022.5512.7b00)
Description: fr-scle-0x2-spare2
MTU 1500 bytes, BW 1000000 Kbit, DLY 10 usec,
reliability 255/255, txload 1/255, rxload 1/255
Encapsulation ARPA, loopback not set
Keepalive set (10 sec)
Full-duplex, 1000Mb/s, link type is auto, media type is 1000BaseSX
input flow-control is on, output flow-control is on
ARP type: ARPA, ARP Timeout 04:00:00
Last input 00:00:01, output never, output hang never
Last clearing of "show interface" counters never
Input queue: 0/2000/0/0 (size/max/drops/flushes); Total output drops: 0
Queueing strategy: fifo
Output queue: 0/40 (size/max)
5 minute input rate 1000 bits/sec, 3 packets/sec
5 minute output rate 1000 bits/sec, 1 packets/sec 158750283 packets input, 52415245126 bytes, 0 no buffer
Received 99952970 broadcasts (50134602 multicasts)
0 runts, 0 giants, 0 throttles
0 input errors, 0 CRC, 0 frame, 0 overrun, 0 ignored
0 input packets with dribble condition detected
3605845 packets output, 299411824 bytes, 0 underruns
0 output errors, 0 collisions, 0 interface resets
0 babbles, 0 late collision, 0 deferred
0 lost carrier, 0 no carrier
0 output buffer failures, 0 output buffers swapped out
Mais les deux seules lignes qui m'intéresses sont celles que j'ai mises en gras.
J'ai donc commencer a réaliser un petit programme en Java, mais pour l'instant il ne fait que lire ligne par ligne mon fichier texte, auriez vous des idées pour extraires ces deux lignes ?
Voici mon fichier Java tel qu'il est pour l'instant :
import java.io.*;
import java.util.*;
class Lecture{
public static void main(String[] args){
String filePath = "Charge-fr-scle-0x2-spare1.txt";
try{
BufferedReader buff = new BufferedReader(new FileReader(filePath));
try {
String line;
// Lire le fichier ligne par ligne
// La boucle se termine quand la méthode affiche "null"
while ((line = buff.readLine()) != null) {
System.out.println(line);
}
buff.close(); //Lecture fini donc on ferme le flux
}
catch (IOException e){
System.out.println(e.getMessage());
System.exit(1);
}
}
catch (IOException e) {
< System.out.println(e.getMessage());
System.exit(1);
}
}
}
8 réponses
Résumé de la discussion
L’objectif est d’extraire deux lignes précises d’un fichier texte généré par un switch, en se focalisant sur des informations de débit et trafic parmi un flux volumineux. Des solutions de parsing ont été proposées, incluant l’usage de indexOf pour repérer les segments pertinents et l’emploi de regex et de splitting pour isoler et stocker ces lignes. Les exemples partagés montrent comment lire ligne par ligne, accumuler les lignes d’intérêt dans une chaîne, puis les découper ou les écrire dans un fichier selon les besoins. En complément, l’échange mentionne des variantes comme l’utilisation de Pattern et de split pour traiter des blocks de texte et sélectionner les numéros et valeurs pertinents.
-
Salut,
Nouvelle version de ton code.
import java.io.*; import java.util.*; class Lecture{ public static void main(String[] args){ String filePath = "Charge-fr-scle-0x2-spare1.txt"; String garder = ""; PrintWriter ficOut; try{ BufferedReader buff = new BufferedReader(new FileReader(filePath)); // try { String line; // Lire le fichier ligne par ligne // La boucle se termine quand la méthode affiche "null" while ((line = buff.readLine()) != null) { System.out.println(line); // ajouter ces 3 lignes <<<<<<<<<<<<<<<<<<<<< int index = line.indexOf("put rate"); // partie commune des lignes à garder if(index > 0) // si on trouve "put rate" garder+= line + "|"; } //System.out.println("\n\ngarder = " + "\"" + garder + "\""); /*Pattern pattern = Pattern.compile("\\|"); // import java.util.regex.Pattern; String[] tabGarder = pattern.split(garder); // pour mettre les lignes conservées // dans le tableau tabGarder */ // ou bien entendu: String[] tabGarder = garder.split("\\|"); System.out.println(""); // Résultat: int rate = 0; int pack = 0; String ligneOut = ""; String lGardee = ""; ficOut = new PrintWriter(new BufferedWriter(new FileWriter("out.txt"))); for(int i = 0; i < tabGarder.length; i++) { lGardee = tabGarder[i]; System.out.println("lGardee: " + "\"" + lGardee + "\""); String[] decompose = lGardee.split(" +"); // " +" au cas où il y aurait plus d'un espace entre les rubriques rate = Integer.parseInt(decompose[4]); System.out.println("rate = " + rate); pack = Integer.parseInt(decompose[6]); System.out.println("pack = " + pack); ligneOut+= rate + " " + pack; ficOut.println(ligneOut); ligneOut = ""; } //try //{ ficOut.close(); buff.close(); //Lecture finie donc on ferme le flux } catch (Exception e) { System.out.println(e.toString()); } } }
Cordialement,
Dan-
-
Je tien quand même à te montrer mon code pour que tu vois à quoi il ressemble =)
===============================================================
import java.io.*;
import java.util.*;
import java.util.regex.Pattern;
class Lecture {
public static void main(String[] args){
String filePath = "Charge-fr-scle-spare1"; //Chemin du fichier texte à lire
String newPath = "Premier.txt"; //Chemin du nouveau fichier texte
String garder = "";
try{
BufferedReader buff = new BufferedReader(new FileReader(filePath));
BufferedWriter out = new BufferedWriter(new FileWriter(newPath));
try {
String line;
while ((line = buff.readLine()) != null){ // Lire le fichier ligne par ligne
//La boucle se termine quand la méthode affiche "null"
//System.out.println(line);
int index = line.indexOf("5 minute"); // Partie commune des lignes à garder
//On regarde s'il existe la sous.chaine(indexOf) "5 minute" dans la ligne lue
if(index > 0){ // Si on trouve "5 minute"
garder += line + "|";
// On fait une concaténation de cette ligne lue dans le String "garder" + le caractère "|" qui sera le séparateur des lignes gardées
}
}
Pattern pattern = Pattern.compile("\\|");
// On recherche dans la chaîne garder si le motif "|" (On met des // devant car sinon il signifie OU) existe
String[] tabGarder = pattern.split(garder); // Pour mettre les lignes conservées dans le tableau tabGarder
// Résultat:
for(int i = 0; i < tabGarder.length; i++) {
String lGardee = tabGarder[i];
//System.out.println("lGardee: " + "\"" + lGardee + "\"");
out.write(lGardee);
out.newLine();
}
buff.close(); //Lecture fini donc on ferme le flux
out.close(); //Ecriture fini donc on ferme le flux
}
catch (IOException e){
System.out.println(e.getMessage());
System.exit(1);
}
}
catch (IOException e) {
System.out.println(e.getMessage());
System.exit(1);
}
}
}
class LectureChiffre extends Lecture {
public static void main(String[] args){
String filePathbis = "Premier.txt"; //Chemin du fichier texte à lire
String newPathbis = "Second.txt"; //Chemin du nouveau fichier texte
try{
BufferedReader buff = new BufferedReader(new FileReader(filePathbis));
BufferedWriter out = new BufferedWriter(new FileWriter(newPathbis));
try {
String line;
while ((line = buff.readLine())!= null){ // Lire le fichier ligne par ligne
//System.out.println(line); //La boucle se termine quand la méthode affiche "null"
String[] decompose = line.split(" "); //Je déompose ma ligne quand il y a un espace
int a = Integer.parseInt(decompose[6]);
System.out.println(a);
out.write(a);
}
buff.close(); //Lecture fini donc on ferme le flux
out.close(); //Ecriture fini donc on ferme le flux
}
catch (IOException e){
System.out.println(e.getMessage());
System.exit(1);
}
}
catch (IOException e) {
System.out.println(e.getMessage());
System.exit(1);
}
}
} -
-
Salut,
Je n'ai plus rien à te conseiller alors...
Si pourtant:
Pour écrire ton fichier out tu fais quelque chose du genre ficOut = new PrintWriter(new BufferedWriter(new FileWriter("out.txt"))); ? (comme dans mon code).
Si oui il y a un piège !
Si le fichier out n'existe pas il sera créé pas de problème,
Mais s'il existe et que tu veux conserver son contenu et donc ajouter à la suite de ce qui existe (append) il faut ajouter le paramètre facultatif true:
ficOut = new PrintWriter(new BufferedWriter(new FileWriter("out.txt, true"))); car par défaut c'est false et on "écrase".
Moi, j'utilise boolean append = true;
Ce qui donne:
ficOut = new PrintWriter(new BufferedWriter(new FileWriter("out.txt, append")));
Si je veux écraser:
append = false;
ficOut = new PrintWriter(new BufferedWriter(new FileWriter("out.txt, append")));
MAIS SEULEMENT POUR LA 1ÈRE LIGNE si on doit en ecrire plusieures.
Pour les éventuelles ligne suivante:
append = true;
ficOut = new PrintWriter(new BufferedWriter(new FileWriter("out.txt, append")));
Si non, c'est bon à savoir.
Dans mon exemple des 2 lignes à écrie, le problème ne se pose pas puisqu'elles sont concaténées dans ligneOut et écrites avec une seule ligne de code.
Dan -
Ah ok merci, c'est bon à savoir ^^
J'aurai encore besoin de ton aide pour un problème d'ordre graphique que j'ai expliquer dans le sujet :
https://forums.commentcamarche.net/forum/affich-21482986-java-encadrer-un-jpanel#p21482986
Si tu pouvais m'aider sa serai simpa :D
-