Lire un fichier Texte dans un plugin java

Fermé
marmoun-83 Messages postés 22 Date d'inscription jeudi 25 août 2011 Statut Membre Dernière intervention 3 septembre 2018 - 3 juin 2016 à 16:22
marmoun-83 Messages postés 22 Date d'inscription jeudi 25 août 2011 Statut Membre Dernière intervention 3 septembre 2018 - 7 juin 2016 à 11:32
Bonjour,

Je n'ai jamais eu l'occasion de coder en Java et n'ai pas trop le temps de me plonger dans des tutos pour le moment donc je me tourne vers des connaisseurs...

Je souhaite lire un fichier texte comprenant 4 colonnes et un nombre N de lignes contenant des valeurs numériques. Sur chaque ligne les valeurs sont séparées par des tabulations soit :

1455[tab]585[tab]655[tab]214
55[tab]5[tab]65[tab]24
...[tab]...[tab]...[tab]...

J'aimerais donc récupérer et stocker chacune de ces valeurs, sous forme de matrice ou autre... afin de pouvoir les appeler dans la suite de mon code.

Pourriez-vous m'aider SVP? En vous remerciant
A voir également:

3 réponses

KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
3 juin 2016 à 19:21
Bonjour,

Tu peux lire ton fichier avec Files.readAllLines ça va te renvoyer une List<String> et pour chaque String qui représente une ligne tu fais un split("\t") sachant que \t est le caractère de tabulation, ça va te donner un tableau String[] avec chacune des tes valeurs (4 a priori) que tu pourras transformer en valeur numérique avec Integer.parseInt par exemple.

Plus de détails dans la documentation :
https://docs.oracle.com/javase/8/docs/api/
0
marmoun-83 Messages postés 22 Date d'inscription jeudi 25 août 2011 Statut Membre Dernière intervention 3 septembre 2018
Modifié par KX le 6/06/2016 à 19:15
Merci pour la réponse... Sur le principe je comprends la démarche mais je ne suis vraiment pas familier avec la syntaxe alors je bloque.

Voilà mon code pour le moment. Si quelqu'un peut me débloquer et faire en sorte que ça marche...

import java.awt.*;
import ij.*;
import ij.gui.*;
import ij.process.*;
import ij.plugin.PlugIn;
import ij.*;
import ij.measure.*;
import ij.plugin.filter.*;
import ij.io.*;
import java.io.*;
import java.util.ArrayList;


public class marmoun implements PlugIn {

public void run(String arg) {

    ArrayList<String> x = new ArrayList<String>();
    ArrayList y = new ArrayList();
      ArrayList z = new ArrayList();
    ArrayList r = new ArrayList();
 

String fichier ="fichier_marmoun.txt";
BufferedReader ficTexte;
try {
 ficTexte = new BufferedReader(new FileReader(new File(fichier)));
 if (ficTexte == null) {
 throw new FileNotFoundException("Fichier non trouvé.");
 }
 String line;
 while((line = ficTexte.readLine())!=null){
          String[] res = line.split("\t");
          x.add(res[0]);
         y.add(res[1]);
          z.add(res[0]);
          r.add(res[1]);
      }

ficTexte.close();
 }catch (FileNotFoundException e) {
  System.out.println(e.getMessage());
 } catch (IOException e) {
  System.out.println(e.getMessage());
  }
  
//Conversion de mon tableau de chaine de caractères en tableau d'integers

    ArrayList<Integer> resultX=new ArrayList<Integer>() ;
    for(String myInt : x) {
         { 
              resultX.add(Integer.valueOf(myInt)); 
            }}
        
//Assignation de la première valeur d'entier du tableau x à la variable i
int i = (int)resultX.get(1);
  
//Affichage d'une boite de dialogue prenant comme variable d'entrée i
   GenericDialog dia = new GenericDialog ("Dimensions de l'image", IJ.getInstance());
   dia.addMessage ("Taille de l'image");
   dia.addNumericField ("suivant X", i, 0);
   dia.addNumericField ("suivant Y", 10, 0);
   dia.addNumericField ("suivant Z", 10, 0);
   dia.showDialog();

  }
  }


Pour le moment, ca ne fonctionne pas, j'ai une erreur IndexOutof Bounds qui me laisse penser que j'ai mal défini ma boucle... mais je ne sais pas... je ne suis pas sûr de la conversion en integer aussi et de ma syntaxe pour lire le Array...

Par avance merci
0
marmoun-83 Messages postés 22 Date d'inscription jeudi 25 août 2011 Statut Membre Dernière intervention 3 septembre 2018
6 juin 2016 à 14:46
Remarque: pour l'instant je n'essaye de faire fonctionner que mon tableau des 'X'
0
marmoun-83 Messages postés 22 Date d'inscription jeudi 25 août 2011 Statut Membre Dernière intervention 3 septembre 2018
6 juin 2016 à 14:56
J'ai également tenté de tout stocker directmeent dans un ArrayList integer sans faire d'étape intermédiaire avec un Integer.parseInt(res[0]) , sans succèes...
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
6 juin 2016 à 19:38
Bonjour,

En gros, voici le code qui correspond à mes explications de vendredi.

import java.io.IOException;
import java.nio.file.*;
import java.util.*;

public class Test {

    public static void main(String[] args) throws IOException {
        int[][] result = extract("C:/test.txt", 4, "\t");
        for (int[] tab : result)
            System.out.println(Arrays.toString(tab));
    }

    public static int[][] extract(String fileName, int nbColumns,
             String delimiter) throws IOException {
        List<String> rows = Files.readAllLines(Paths.get(fileName));
        int nbRows = rows.size();
        int[][] result = new int[nbRows][nbColumns];
        for (int row = 0; row < nbRows; row++) {
            String[] columns = rows.get(row).split(delimiter);
            for (int col = 0; col < nbColumns; col++) {
                result[row][col] = Integer.parseInt(columns[col]);
            }
        }
        return result;
    }
}
0
marmoun-83 Messages postés 22 Date d'inscription jeudi 25 août 2011 Statut Membre Dernière intervention 3 septembre 2018
Modifié par marmoun-83 le 6/06/2016 à 21:14
Merci Beaucoup, j'essaye ça demain matin !

Tu m'as donc proposé deux méthodes, une avec la fonction "extract" et une en lisant le fichier texte et en bouclant sur les lignes et les colomnes on est d'accord?

A priori , les deux manières de faire fonctionnent ou bien il y en a une a privilégier?
0
marmoun-83 Messages postés 22 Date d'inscription jeudi 25 août 2011 Statut Membre Dernière intervention 3 septembre 2018
7 juin 2016 à 11:21
Malheureusement, je n'arrive pas à faire fonctionner cela, voilà mes erreurs :
- import java.nio.file.*; ==> le package n'existe pas
- "Cannot find symbol method extract"

Le problème majeu que je rencontre en fait est que pour l'implémentation du plugin je suis contraint d'utiliser la structure suivante.

mport ij.*;
import ij.process.*;
import ij.gui.*;
import java.awt.*;
import ij.plugin.*;
import ij.plugin.frame.*;

public class My_Plugin implements PlugIn {

public void run(String arg) {

}

}

Si j'implémente ton code à l'intérieur de ma class My_Plugin, je reçois un message d'erreur me disant "My_Pluign is not abstract and does not override abstract method run". Je dois dire que je ne me rapelle plus trop de ces histoires de classes privées publiques abstractes.....

Je comprends bien le sen de ton code donc mais n'arrive pas à le faire tourner. Merci pour ton aide.
0
marmoun-83 Messages postés 22 Date d'inscription jeudi 25 août 2011 Statut Membre Dernière intervention 3 septembre 2018
7 juin 2016 à 11:32
Mon code :

import ij.*;
import ij.gui.*;
import ij.process.*;
import ij.plugin.PlugIn;
import ij.*;
import ij.measure.*;
import ij.plugin.filter.*;
import ij.io.*;
import java.io.*;
import java.io.IOException;
import java.util.*;
import java.util.ArrayList;



public class marmoun_V2 implements PlugIn {

public static void main(String[] args) throws IOException {
int[][] result = extract("/home/smarmounie/Plugin/fichier_marmoun.txt", 4, "\t");
for (int[] tab : result)
System.out.println(Arrays.toString(tab));
}
public static int[][] extract(String fileName, int nbColumns,
String delimiter) throws IOException {
List<String> rows = Files.readAllLines(Paths.get(fileName));
int nbRows = rows.size();
int[][] result = new int[nbRows][nbColumns];
for (int row = 0; row < nbRows; row++) {
String[] columns = rows.get(row).split(delimiter);
for (int col = 0; col < nbColumns; col++) {
result[row][col] = Integer.parseInt(columns[col]);
}
}
return result;
}
}

Et mon message d'erreur :


Started marmoun_V2.java at Tue Jun 07 11:30:52 CEST 2016
Compiling 1 file in /tmp/java3517766740840905638
/tmp/java3517766740840905638/src/main/java/marmoun_V2.java:17: marmoun_V2 is not abstract and does not override abstract method run(java.lang.String) in ij.plugin.PlugIn
public class marmoun_V2 implements PlugIn {
^
/tmp/java3517766740840905638/src/main/java/marmoun_V2.java:26: cannot find symbol
symbol : variable Paths
location: class marmoun_V2
List<String> rows = Files.readAllLines(Paths.get(fileName));
^
/tmp/java3517766740840905638/src/main/java/marmoun_V2.java:26: cannot find symbol
symbol : variable Files
location: class marmoun_V2
List<String> rows = Files.readAllLines(Paths.get(fileName));
^
3 errors
java.lang.ClassNotFoundException: marmoun_V2
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
at org.scijava.plugins.scripting.java.JavaEngine.compile(JavaEngine.java:230)
at org.scijava.plugins.scripting.java.JavaEngine.eval(JavaEngine.java:135)
at org.scijava.plugins.scripting.java.JavaEngine.eval(JavaEngine.java:173)
at org.scijava.script.ScriptModule.run(ScriptModule.java:174)
at org.scijava.module.ModuleRunner.run(ModuleRunner.java:167)
at org.scijava.module.ModuleRunner.call(ModuleRunner.java:126)
at org.scijava.module.ModuleRunner.call(ModuleRunner.java:65)
at org.scijava.thread.DefaultThreadService$2.call(DefaultThreadService.java:191)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
java.lang.NullPointerException
at java.lang.Class.isAssignableFrom(Native Method)
at org.scijava.plugins.scripting.java.CommandJavaRunner.supports(CommandJavaRunner.java:71)
at org.scijava.plugins.scripting.java.CommandJavaRunner.supports(CommandJavaRunner.java:46)
at org.scijava.plugins.scripting.java.DefaultJavaService.run(DefaultJavaService.java:60)
at org.scijava.plugins.scripting.java.JavaEngine.eval(JavaEngine.java:136)
at org.scijava.plugins.scripting.java.JavaEngine.eval(JavaEngine.java:173)
at org.scijava.script.ScriptModule.run(ScriptModule.java:174)
at org.scijava.module.ModuleRunner.run(ModuleRunner.java:167)
at org.scijava.module.ModuleRunner.call(ModuleRunner.java:126)
at org.scijava.module.ModuleRunner.call(ModuleRunner.java:65)
at org.scijava.thread.DefaultThreadService$2.call(DefaultThreadService.java:191)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)


Si tu as une idée je t'en serai très reconnaissant
0