Parcourir un fichier texte [Résolu]

dino34 24 Messages postés jeudi 6 janvier 2011Date d'inscription 24 juin 2017 Dernière intervention - 17 juin 2017 à 17:19 - Dernière réponse : dino34 24 Messages postés jeudi 6 janvier 2011Date d'inscription 24 juin 2017 Dernière intervention
- 24 juin 2017 à 20:16
Bonjour:

J'ai un fichier de 1000 ligne , j'ai pris deux portion du fichier :

le fichier en image est le suivant :

NB: le nombre de ligne fixe entre le premier DESIGN et le second DESIGN

est 6 après élimination du vide.

j'ai commencer par ça mais je trouve des difficulté à parcourir le fichier et

obtenir ce que je veux

   public void actionPerformed(ActionEvent arg0) {
    try {
     sc = new Scanner(new File("Test.txt"));
    } catch (FileNotFoundException e) {
     
     e.printStackTrace();
    }
    
    while (sc.hasNextLine() )
    {
     if (sc.nextLine().equals("DESIGN"));
    
     System.out.println(sc.nextLine());
    }

    sc.close();
   } 



je cherche a obtenir ce qui suit :

Qality= DSCP&PBIT&1  %                              
Qality= PART1 =Qlt=PBIT/10 %
Qality= PART2 =Qlt=PBIT/20 %
Qality= DSCP&PBIT&1 && Qlt=PBIT/10 %

Merci pour votre aide et support
Afficher la suite 

13 réponses

Répondre au sujet
Twinuts 5261 Messages postés dimanche 4 mai 2003Date d'inscriptionModérateurStatut 20 avril 2018 Dernière intervention - 20 juin 2017 à 19:34
0
Utile
Salut,

L'image n'est pas passée, donc impossible de comprendre vraiment ce que tu cherches à faire.

Cependant faire 2 nextLine dans la même boucle sans jamais tester si tu peux faire le deuxième est source de bugs surtout si au lieu d'avoir :

DESIGN\n
blabla\n



Tu as:

DESIGN blabla




Commenter la réponse de Twinuts
KX 15363 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 20 avril 2018 Dernière intervention - 20 juin 2017 à 21:39
0
Utile
Bonjour,

Avec Scanner tu peux utiliser des expressions régulières, ce serait très pratique dans ton cas.

Par contre, je ne comprends pas le rapport entre ton image et le résultat que tu cherches à obtenir.
Commenter la réponse de KX
0
Utile
salut:

j'ai pris capture d’écrans sur le fichier texte que j'ai .

veuillez retrouver ci-dessous le fichier texte .


Display Qality type
begin

DESIGN PBIT
DSCP&PBIT&1 ENB


PART1 SBIT
Qlt=PBIT/10 CLK

PART2 SBIT
Qlt=PBIT/20 CLK

DESIGN PBIT
DSCP&PBIT&3 ENB


PART1 SBIT
Qlt=PBIT/40 FAIL

PART2 SBIT
Qlt=PBIT/50 ACT


END



comment utilisé les expression régulière ?

j'ai commencer par ça :



Pattern ss[] = {

Pattern.compile("([a-z]+)((DESIGN))"),
Pattern.compile("([a-z]+)((PART1))") ,
Pattern.compile("([a-z]+)((PART2))") ,
};



Scanner sc = new Scanner(new File("Test.txt")"));
String line;
int i;
while (sc.hasNextLine()) {
line = sc.nextLine();
i = 0;
Matcher match = ss[i].matcher(line);

}
}
sc.close();
}
}



Merci
Commenter la réponse de dino35
KX 15363 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 20 avril 2018 Dernière intervention - Modifié par KX le 21/06/2017 à 19:17
0
Utile
Bonjour,

Voici un exemple de code dont le résultat correspond à ce que tu montrais dans ta question :

Qality= DSCP&PBIT&1  %
Qality= PART1 =Qlt=PBIT/10 %
Qality= PART2 =Qlt=PBIT/20 %
Qality= DSCP&PBIT&1 &&  Qlt=PBIT/10 %

Qality= DSCP&PBIT&3  %
Qality= PART1 =Qlt=PBIT/40 %
Qality= PART2 =Qlt=PBIT/50 %
Qality= DSCP&PBIT&3 &&  Qlt=PBIT/40 %

try (Scanner sc = new Scanner(new File("C:/test.txt"))) {
    sc.useDelimiter("DESIGN");
    String p = "\\s+(\\S+)";
    Pattern pattern = Pattern.compile(p+p+p+p+p+p+p+p+p+p+p);

    while (sc.hasNext()) {
        Matcher matcher = pattern.matcher(sc.next());
        if (matcher.find()) {
            System.out.println("Qality= " + matcher.group(2) + "  %");
            System.out.println("Qality= " + matcher.group(4) + " =" + matcher.group(6) + " %");
            System.out.println("Qality= " + matcher.group(8) + " =" + matcher.group(10) + " %");
            System.out.println("Qality= " + matcher.group(2) + " &&  " + matcher.group(6) + " %");
            System.out.println();
        }
    }
}

La confiance n'exclut pas le contrôle
Commenter la réponse de KX
0
Utile
1
Bonjour KX et merci beaucoup :

le code marche bien , je m'excuse j'ai fait une erreur de

description du fichier texte .


si j'ai d'autre colonnes , le code ne marche pas voici le fichier texte :



Display Qality type
begin

DESIGN PBIT SST MI CH
DSCP&PBIT&1 ENB 1 1


PART1 SBIT AT DF MI
Qlt=PBIT/10 CLK

PART2 SBIT AT NS MI
Qlt=PBIT/20 CLK

DESIGN PBIT SST MI CH
DSCP&PBIT&3 ENB 1 1


PART1 SBIT AT NS CS
Qlt=PBIT/40 FAIL

PART2 SBIT AT NS MI
Qlt=PBIT/50 ACT

END


2/ je veux avoir ceci:


Qality= DSCP&PBIT&1 %
Qality= PBIT/10 %
Qality= PBIT/20 %
Qality= DSCP&PBIT&1 && Qlt=PBIT/10 %

Qality= DSCP&PBIT&3 %
Qality= PBIT/40 %
Qality= PBIT/50 %
Qality= DSCP&PBIT&3 && Qlt=PBIT/40 %


3/

Est que je peux afficher le résultat dans textArea comme ceci :



textArea.append("Qality= " + matcher.group(2) + " %");
textArea.append("Qality= " + matcher.group(4) + " =" + matcher.group(6) + " %");
textArea.append("Qality= " + matcher.group(8) + " =" + matcher.group(10) + " %");
textArea.append("Qality= " + matcher.group(2) + " && " + matcher.group(6) + " %");
textArea.append();




4/ Est ce que tu peux nous expliqué le code tellement il est

intéressant de le comprendre ?

merci et je m’excuse encore une fois .
KX 15363 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 20 avril 2018 Dernière intervention - 22 juin 2017 à 19:11
Bonjour,

"4/ Est ce que tu peux nous expliqué le code tellement il est intéressant de le comprendre ?"

Par défaut Scanner coupe ses éléments sur les sauts de lignes, en utilisant useDelimiter("DESIGN") je lui demande de les découper avec Design, et bien sûr j'utilise next() au lieu de nextLine() pour qu'il prenne en considération mon délimiteur perso.

Je me retrouve donc avec un bloc de texte sur plusieurs lignes (entre deux "DESIGN") qui correspond à un bloc de résultat attendu.

Ces blocs de texte sont composés en alternance d'un ou plusieurs espaces (expression régulière
\s+
) et d'un ou plusieurs caractères "non-espace" (expression régulière
\S+
) que je capture en rajoutant les parenthèses pour obtenir ma variable
String p = "\\s+(\\S+)";
qui représente un champs texte dans ton bloc.

Il faut donc autant de
p
dans l'expression régulière qu'il y a de champs à récupérer. J'en avais 11 hier (avec mon
p+p+p+p+p+p+p+p+p+p+p
), il va en falloir 22 aujourd'hui avec ta nouvelle description de fichiers.

Après c'est un code basique de pattern/matching avec une expression régulière, je regarde si ça matche (ce qui n'est pas le cas pour le premier bloc puisqu'il est avant le premier DESIGN) et si oui je récupère dans mes 11 (ou 22) groupes ceux qui m'intéressent pour reconstituer l'affichage comme il faut.

Comme ce sont des String après on en fait ce que l'on veut, println ou TextArea peu importe, le mieux d'ailleurs serait de les stocker dans des objets (avec une classe dédiée) pour savoir à quoi correspond chaque valeur que l'on a extrait.

Bref, du coup pour faire évoluer ton code, il te faut donc 22
p
au lieu des 11, qui seront répartis comme ceci :

Du coup ça donnerait plutôt :
textArea.append("Qality= " + matcher.group(5) + "  %");                             
textArea.append("Qality= " + matcher.group(14) + " %");    
textArea.append("Qality= " + matcher.group(21) + " %");   
textArea.append("Qality= " + matcher.group(5) + " &&  " + matcher.group(14) + " %"); 
textArea.append();
Commenter la réponse de dino35
dino34 24 Messages postés jeudi 6 janvier 2011Date d'inscription 24 juin 2017 Dernière intervention - 23 juin 2017 à 19:14
0
Utile
1
salut KX:

il marche bien , mais je n'ai pas obtenu ce que je veux :

1/ est ce qu'on peux faire un offset sur Qlt= c-a-d éliminer cette dernière voir capture écrans



pour avoir le résultat ci-dessous :



Qality= DSCP&PBIT&1 %
Qality= PBIT/10 %
Qality= PBIT/20 %
Qality= DSCP&PBIT&1 && Qlt=PBIT/10 %



2/ pour afficher le résultat dans textarea j'ai le fault code suivant :



Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at chgrot.dcfgt$2.actionPerformed(test.java:73)



qui corespond à la ligne :




public class test {

private JFrame frame;
protected Scanner sc;
private JTextArea textArea;

.
.
.
public void actionPerformed(ActionEvent arg0) {
try (Scanner sc = new Scanner(new File("C:\\test.txt"))) {
sc.useDelimiter("DESIGN");
String p = "\\s+(\\S+)";
Pattern pattern = Pattern.compile(p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p);

while (sc.hasNext()) {
Matcher matcher = pattern.matcher(sc.next());
if (matcher.find()) {
textArea.append("Qality= " + matcher.group(5) + " %");





Merci
KX 15363 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 20 avril 2018 Dernière intervention - 23 juin 2017 à 19:40
Bonjour,

"est ce qu'on peux faire un offset sur Qlt"
Bien sûr, avec la regex actuelle tu obtiens un String "Qlt=PBIT/10" mais tu peux le retravailler pour en extraire que la fin :
matcher.group(14).substring(4)


Quant à ton NullPointerException c'est sûrement parce que ton textArea n'a pas été initialisé dans ta fenêtre (il vaut donc null).
Commenter la réponse de dino34
dino34 24 Messages postés jeudi 6 janvier 2011Date d'inscription 24 juin 2017 Dernière intervention - 23 juin 2017 à 20:37
0
Utile
1
merci beaucoup Kx ca marche bien .

mais que que je fasse j'ai toujour le code d'erreur (NullPointerException ) veuillez trouver le code cité ci-dessous:

Comment initialiser textArea ?



package teststring;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.awt.event.ActionEvent;
import javax.swing.JTextField;
import javax.swing.JTextArea;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
import javax.swing.JPanel;

public class test1 {

private JFrame frame;
protected Scanner sc;

public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
test1 window = new test1();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

public test1() {
initialize();
}


private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 521, 432);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);

JButton btnNewButton = new JButton("Do");
btnNewButton.addActionListener(new ActionListener() {



private JTextArea textArea;

public void actionPerformed(ActionEvent arg0) {
try (Scanner sc = new Scanner(new File("C:\\test.txt"))) {
sc.useDelimiter("DESIGN");
String p = "\\s+(\\S+)";
Pattern pattern = Pattern.compile(p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p);

while (sc.hasNext()) {
Matcher matcher = pattern.matcher(sc.next());
if (matcher.find()) {

textArea.append("EXSPI:NAME= " + matcher.group(14).substring(4) + " ;");
}


}
sc.close();
} catch (FileNotFoundException e) {

e.printStackTrace();
}
}
});


btnNewButton.setBounds(168, 33, 224, 23);
frame.getContentPane().add(btnNewButton);

JTextArea textArea = new JTextArea();
textArea.setBounds(57, 105, 391, 278);
frame.getContentPane().add(textArea);
}
}


KX 15363 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 20 avril 2018 Dernière intervention - 23 juin 2017 à 20:58
Ligne 56 tu as
private JTextArea textArea;
il faudrait lui donner une valeur... comme tu l'as fait avec le
JTextArea textArea = new JTextArea();
de la ligne 85, mais c'est bizarre d'en avoir deux, ce devrait être la même.

Globalement ta frame est mal construite, voici comment la corriger :

import java.io.*;
import java.util.Scanner;
import java.util.function.Consumer;
import java.util.regex.*;

import javax.swing.*;

public class Test1 extends JFrame {

    private static final long serialVersionUID = 1L;

    public static void main(String[] args) {
        new Test1().setVisible(true);
    }

    public Test1() {
        setBounds(100, 100, 521, 432);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(null);

        JTextArea textArea = new JTextArea();
        textArea.setBounds(57, 105, 391, 278);
        add(textArea);

        JButton btnNewButton = new JButton("Do");
        btnNewButton.setBounds(168, 33, 224, 23);
        add(btnNewButton);

        btnNewButton.addActionListener(e -> doAction(textArea::append));
    }

    private static void doAction(Consumer<String> append) {
        try (Scanner sc = new Scanner(new File("C:\\test.txt"))) {
            sc.useDelimiter("DESIGN");
            String p = "\\s+(\\S+)";
            Pattern pattern = Pattern.compile(p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p);
            while (sc.hasNext()) {
                Matcher matcher = pattern.matcher(sc.next());
                if (matcher.find()) {
                    append.accept("EXSPI:NAME= " + matcher.group(14).substring(4) + "  ;");
                }
            }
            // sc.close(); // inutile dans un try-with-resources !
        } catch (FileNotFoundException e) {
            throw new UncheckedIOException(e);
        }
    }
}
Commenter la réponse de dino34
dino34 24 Messages postés jeudi 6 janvier 2011Date d'inscription 24 juin 2017 Dernière intervention - 24 juin 2017 à 01:24
0
Utile
1
salut KX:

j'ai java 7 et la version d'IDE que j'ai est eclipse MARS.1.

ça marche maintenant , j'ai fermé et recréer un nouveau projet .

merci beaucoup pour votre support

--
KX 15363 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 20 avril 2018 Dernière intervention - 24 juin 2017 à 09:19
On peut le faire en Java 7 aussi.

Il faudrait juste remplacer :
        btnNewButton.addActionListener(e -> doAction(textArea::append));
    }

    private static void doAction(Consumer<String> append) {

Par :
        btnNewButton.addActionListener(new ActionListener() {            
            @Override
            public void actionPerformed(ActionEvent e) {
                doAction(textArea);
            }
        });
    }

    private static void doAction(JTextArea jTextArea) {

Et
append.accept("EXSPI:NAME= "
par
jTextArea.append("EXSPI:NAME= "
.

Remarque : sachant que Java 9 sort cette année il serait peut-être temps de se mettre à Java 8 avant d'avoir deux versions de retard ;-)
Commenter la réponse de dino34
dino34 24 Messages postés jeudi 6 janvier 2011Date d'inscription 24 juin 2017 Dernière intervention - 24 juin 2017 à 20:16
0
Utile
salut KX:

ça marche bien et encore une je vous remercie pour votre support et conseil



--
Commenter la réponse de dino34

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.