IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Lecture par bouts de chaînes de longueur variable


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 263
    Par défaut Lecture par bouts de chaînes de longueur variable
    Bonjour.

    Une question, svp. Mon applic reçoit différents fichiers texte au format csv étant caractérisés par:
    - Lignes de longueur variable (20 à 23 caractères, y compris le '\n' invisible de fin de ligne).
    Essentiellement des valeurs décimales.
    - De ± 15.000 à ± 35.000 lignes
    - Chaque ligne comprend 2 champs terminés par ';'
    - Se terminant par 'EOF' (-1).
    La finalité est de remplir une table apparaissant dans un GUI Swing.

    1) Je voudrais savoir quelles instructions Java employer ...
    - pour lire les fichiers (± 807.000octets) par bouts de chaînes de caractères de longueur variable, c à d s'arrêtant chaque fois au '\n' (20 à 23 car.)
    - pour si possible mettre chaque nouvelle chaîne lue dans le tampon de caractères consécutif d'une ByteBuffer[]. Cette Array serait initialement implémentée à [15.000][23], et serait aggrandie dynamiquement (malloc()) par groupes de 10 tampons (de 23 octets) au besoin.
    Je viens d'étudier les classes 'File', 'FileInputStream', 'FileChannel', ... et fonctions
    'canalFichier.read(ByteBuffer[] tamponsLect, int offset, int longueur) ... mais elles ne me permettent pas de réaliser une lecture pas groupe de caractères de longueur variable, il me semble.
    Existerait-il une fonction 'read(...)' effectuant un 'parsing' de deux caractères
    - '-1' pour la fin du fichier
    - mais aussi un caractère au choix : '\n' dans mon cas ... très général, il me semble.

    2) A présent, j'ai programmé un algoritme de lecture par tampons de 23 octets fixes de longueur. A l'aide de
    System.out.println(((ByteBuffer)(tamponLect.flip())).asCharBuffer().toString());
    , je vois apparaître les caractères dans la fenêtre 'Output' de mon IDE NetBeans. Il n'apparaît que des symboles japonais ou chinois. Que faire pour obtenir les caractères ASCII ?

    Merci d'avance pour votre aide.
    Utile pour beaucoup d'entre nous, pas vrai ?

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 394
    Par défaut
    Bonjour,

    Je pense que tu n'as pas compris la philosophie de Java. En Java on ne s'occupe pas de l'allocation mémoire, donc pas de malloc ou autres... Les chaines de longueurs variables c'est pas un problème en Java !

    Pour lire un fichier CSV je te conseil de passer par une bibliothèque externe. Deux articles sont dispos ici :
    http://thierry-leriche-dessirier.dev...ier-csv-5-min/
    http://thierry-leriche-dessirier.dev...csv-avec-java/

    Si tu n'es pas familier avec Java et qu'ajouter une librairie externe à ton projet te parait compliqué tu peux utiliser ce bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
      public List<String[]> lireFichierCSV(String nomFichier, String separateurChamp) throws FileNotFoundException {
        List<String[]> contenuFichierCSV = new ArrayList<String[]>();
     
        File fichierCsv = new File(nomFichier);
        Scanner scanner = new Scanner(fichierCsv);
        while (scanner.hasNext()) {
          String ligne = scanner.nextLine();
          String[] cellules = ligne.split(separateurChamp);
     
          contenuFichierCSV.add(cellules);
        }
        scanner.close();
     
        return contenuFichierCSV;
      }
    Attention ce bout de code est très sommaire. Si jamais tes champs contiennent le séparateur de champ ça ne fonctionnera pas.

    Ensuite tu peux utiliser la fonction comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    List<String[]> lignesCSV = lireFichierCSV("monFichier.csv",";");
    for(String[] cellules : lignesCSV){
        String champ1 = cellules[0];
        String champ2 = cellules[1];
     
        // remplir ta table swing ici
    }
    Bon courage,
    Romain.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 263
    Par défaut
    Merci Romain pour ta réponse ... bien efficace.
    J'ai lu le document http://thierry-leriche-dessirier.dev...ec-java/#L16-C de Thierry Leriche-Dessirier. Vraiment à recommander. Enfin compréhensible.
    J'en ai implémenté les classes et j'arrive à obtenir un objet de type-classe CsvFile dont getData() retourne un objet de type List<String[]>.
    Pourrais-tu m'indiquer les instructions à rechercher pour que je puisse convertir cet objet de type List<String[]> en un objet de type Object[][] que nécessite MonModèleDeTable pour que mon tableau affiche toutes les données de mon fichier CSV ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
        class MonModèleDeTable extends AbstractTableModel
        {   // Déclarations de variables
            private String[] nomsColonnes = {"Instant", "Puiss"};
            private Object[][] donnéesDEntrée = csvFile.getData();
    /*        {   
                 {"1/01/2013  00:00:00", "46.5"},
                 {"1/01/2013  00:15:00", "47.52"},
                 {"1/01/2013  00:30:00", "46.5"},
                 {"1/01/2013  00:45:00", "46.42"},
                 {"1/01/2013  01:00:00", "46.42"},
                 {"1/01/2013  01:15:00", "45"},
                 {"1/01/2013  01:30:00", "43"},
                 {"1/01/2013  01:45:00", "42.5"},
                 {"1/01/2013  02:00:00", "69"}
     */
            };
    Merci d'avance. Je n'oublierai pas aussi tôt que possible la mention "Résolu".

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 394
    Par défaut
    Bonjour,

    Tu peux faire comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     public Object[][] convertirLignes(List<String[]> lignes) {
        // 2 correspond au nombre de colonne de ton fichier csv
        return lignes.toArray(new Object[lignes.size()][2]);
      }
    Romain.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 263
    Par défaut
    Merci bien, Romain.
    Ca, maintenant !
    Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 2
    at choixpuissmachcogén.FichierDonnéesDEntrée$MonModèleDeTable.getValueAt(FichierDonnéesDEntrée.java:308)
    at javax.swing.JTable.getValueAt(JTable.java:2716)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class MonModèleDeTable extends AbstractTableModel
        {   // Déclarations de variables
            private String[] nomsColonnes = {"Instant", "Puiss."};
            private List<String[]> données = csvFile2.getData();
            private Object[][] donnéesDEntrée = données.toArray(new Object[données.size()][2]);
            // Fin des déclarations de variables
     
            @Override public Object getValueAt(int row, int col)
            {   return donnéesDEntrée[row][col];
            }

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 394
    Par défaut
    Bonjour,

    En informatique le premier élément d'un tableau se trouve toujours à l'index 0.

    Donc pour accéder à la première ligne et la première cellule de ton tableau c'est :
    Deuxième ligne, deuxième colonne :
    ------------
    | 0,0 | 0,1 |
    ------------
    | 1,0 | 1,1 |
    ------------
    | 2,0 | 2,1 |
    ------------
    ...

    Romain.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [awk] Sous-chaîne de longueur variable
    Par David_LeNovis dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 14/11/2013, 13h49
  2. lecture de lignes de longueurs variables
    Par moon61 dans le forum C
    Réponses: 14
    Dernier message: 09/04/2009, 10h13
  3. Tableau de chaînes de longueur variable
    Par alband85 dans le forum C#
    Réponses: 3
    Dernier message: 20/08/2007, 09h49
  4. Réponses: 1
    Dernier message: 30/04/2007, 15h33
  5. Réponses: 3
    Dernier message: 14/04/2006, 09h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo