Parcourir un fichier texte

Résolu
dino34 Messages postés 32 Date d'inscription jeudi 6 janvier 2011 Statut Membre Dernière intervention 3 novembre 2023 - Modifié le 20 juin 2017 à 19:59
dino34 Messages postés 32 Date d'inscription jeudi 6 janvier 2011 Statut Membre Dernière intervention 3 novembre 2023 - 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

9 réponses

Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
20 juin 2017 à 19:34
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




0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 127
20 juin 2017 à 21:39
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.
0
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
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 127
Modifié le 21 juin 2017 à 19:17
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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 .
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 127
Modifié le 22 juin 2017 à 19:15
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();
0
dino34 Messages postés 32 Date d'inscription jeudi 6 janvier 2011 Statut Membre Dernière intervention 3 novembre 2023
23 juin 2017 à 19:14
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
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 127
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).
0
dino34 Messages postés 32 Date d'inscription jeudi 6 janvier 2011 Statut Membre Dernière intervention 3 novembre 2023
23 juin 2017 à 20:37
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);
}
}


0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 127
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);
        }
    }
}
0
dino34 Messages postés 32 Date d'inscription jeudi 6 janvier 2011 Statut Membre Dernière intervention 3 novembre 2023
24 juin 2017 à 01:24
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

--
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 127
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 ;-)
0
dino34 Messages postés 32 Date d'inscription jeudi 6 janvier 2011 Statut Membre Dernière intervention 3 novembre 2023
24 juin 2017 à 20:16
salut KX:

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



--
0
Rejoignez-nous