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

Langages de programmation Discussion :

Découper String en tableau. De quelle sorte ?


Sujet :

Langages de programmation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2012
    Messages : 7
    Par défaut Découper String en tableau. De quelle sorte ?
    Bonjour,

    On me demande d'analyser un fichier de log (.dat) pour en extraire des lignes bien précises puis certains champs de ces lignes.
    Je réussi à extraire les lignes qui m'intéressent grâce aux regex.
    Voici le genre de String :

    R|DA|DA0001436\1000|A0001436-100-01TO110D0005|DA0001436\1000|0930930033703|||0000000001.00000|NB|||20130128|LO1|MPR|...

    Comme vous le constatez, cette String est découpée en champs séparés par des "|"
    J'hésite quand à la meilleur méthode à adopter pour mettre ces strings en tableau : utiliser un simple tableau, une hastable, hashmap... ? pour pouvoir ensuite ne garder que les champs qui m'intéressent et les écrire dans un fichier .csv

    Quelle serait, selon vous, la méthode la plus efficace ?

    Mon autre problème est que pour d'autres String du même fichier le séparateur n'est pas un tube mais un ";" :

    A24342;20121015;OF036091\20;FMG;FM5L4CA1B;SS;9;...

    Je compte utiliser un "replace" pour transformer les différents séparateurs en un seul.
    Suis-je sur la bonne piste ?
    (je sors de formation et c'est ma première mission pro. J'aimerais la réussir...)

    PS : je code en Java

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 401
    Par défaut
    Franchement, chaque champ a une signification et la string possède un format bien défini (ou deux formats bien définis), non?

    Dans ce cas, le mieux serait de séparer en simple tableau avec split(), puis mettre chaque élément du tableau dans le champ correspondant d'une classe...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2012
    Messages : 7
    Par défaut
    Merci pour ta réponse Médinoc,

    Effectivement : je n'ai mis que 2 String en exemple mais il y en a bien d'autres sortes.
    En fait, le fichier que je dois traiter (entre 25 000 et 35 000 lignes, ça dépend des jours) est composé de "blocs" correspondant aux rapports de différents traitements.
    Presque chaque bloc a un style de String différent et un encodage différent (ANSI, UTF8).

    Comme je dois générer un fichier (nettoyé des lignes et colonnes "inutiles") pour chaque bloc, je pense créer une class pour le traitement de chacun d'entre eux, ça sera plus évolutif si je dois ensuite créer des class pour de nouveaux blocs.

    Je compte donc pour chaque bloc :
    - mettre les lignes qui m'intéressent dans un tableau, comme tu me le conseille,
    - sélectionner les colonnes que je dois garder,
    - appeler une méthode pour les écrire dans un fichier.

    Pas d'hérésie dans mes propos ?

    Je ne manquerai pas de vous tenir informé de l'évolution de mon application.

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2012
    Messages : 7
    Par défaut
    Bon...

    J'arrive à découper ma string en tableau pour la mettre dans un arrayList. Mais j' écris les string successives toujours sur la même ligne :
    lorsque je découpe mes string elles s'affichent bien dans la console mais quand je veux écrire l'arrayList j'ai la même adresse mémoire de colonne pour chaque ligne.
    J'ai beau chercher sur le net , je tourne en rond.

    Le code : (j'ai mis des out.print"index ligne et colonne" pour essayer de comprendre)
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    package test_split;
    
    import java.io.*;
    import java.util.*;
    
    public class Test_split {
    
        public static void main(String[] args) {
            //String fichierLu = "ZINT315B_20121120.dat";
            String fichierLu = "1_ZINT315B_20121120.dat";
            String fichierEc = "Traitement_Fichier_Ecriture.csv";
            BufferedReader fluxEntree;
            
            String ligneLue = "";
            String[] ligneSplit = {};
            List<String[]> aLignes = new ArrayList<String[]>();
            int indexLigne=0, indexColonne=0;
            Iterator iter = aLignes.listIterator();
    
            try {
                fluxEntree = new BufferedReader(new FileReader(new File(fichierLu)));
                
                
                
                while (ligneLue != null) {
                    
                    if (ligneLue.matches("R.*")) {   
                        ligneLue = ligneLue.replace("|", ",!");
                        ligneSplit = ligneLue.split("!");
                        System.out.println(" index aLignes : "+indexLigne);
                        
                        for (indexColonne=0; indexColonne<ligneSplit.length; indexColonne++) {
                            System.out.println(ligneSplit[indexColonne]+"         index colonne : "+indexColonne);
                            aLignes.add(indexLigne, ligneSplit.clone());//aLignes.add(aLignes.indexOf(iter), ligneSplit.clone());
                        }
                        aLignes.iterator().next();
                        indexLigne++;
                    }//fin if
                    
                    System.out.println("--------------------------------------------");
                    ligneLue = fluxEntree.readLine();
                    
                }//fin while
            }
            catch (Exception eLect) {
                System.out.println("Erreur lecture flux entree :"+eLect.getMessage());
            }   
            
            try {
                Writer fluxSortie = null;
                fluxSortie = new PrintWriter(new BufferedWriter(new FileWriter(fichierEc))); 
                while (iter.hasNext()) {
                    for (int k=0; k<indexColonne; k++) {
                    System.out.print("index colonne :  "+k+"  ");
                    System.out.println(aLignes.get(k).toString());
                    fluxSortie.write(ligneSplit[k].toString());
                    }
                iter.next();
                }
            }
            catch (Exception eIt) {
                System.out.println("erreur ecr :"+eIt.getMessage());
            }
            
        }//fin main
        
    }
    et la console (certains champs ne contiennent rien donc c'est normal qu'il y ait juste les , devant "index ...")
    Le premier affichage, lorsque je rempli mon arrayList est correcte (tous les champs de toutes les lignes)

    ...
    , index colonne : 39
    , index colonne : 40
    --------------------------------------------
    index aLignes : 2
    R, index colonne : 0
    UO_S001, index colonne : 1
    ...
    , index colonne : 39
    , index colonne : 40
    --------------------------------------------
    index colonne : 0 [Ljava.lang.String;@246bc73b
    index colonne : 1 [Ljava.lang.String;@1fe5052b
    ...
    index colonne : 39 [Ljava.lang.String;@7f54e38b
    index colonne : 40 [Ljava.lang.String;@1e26fbfc
    erreur ecr :null
    BUILD SUCCESSFUL (total time: 0 seconds)
    Si quelqu'un a une idée...

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2012
    Messages : 7
    Par défaut
    J'ai un peu l'impression de faire un monologue, mais bon...
    J'ai trouvé une solution beaucoup plus simple : un arrayList de String dans lesquelles j'ai remplacé les tubes "|" par des ";" et ça marche.
    Même si j'aurais préféré un tableau pour pouvoir sélectionner les colonnes.

    Bref avec ça, ça marche :
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    package analyse_fichier;
    
    import java.util.*;
    import java.io.*;
    
    public class Analyse_Fichier {
    
        public static void main(String[] args) {
            String fichierLu = "fichier_source.dat";
            Date date = new Date();
            String sDate = date.toString().replace(":", "-");
            String fichierEc = "fichier_genere_"+sDate+".csv";
            
    	String ligneLue = "";
            BufferedReader fluxEntree;
            List<String> aLignes = new ArrayList<String>();
            int NbLigneSource=0, NbLignExtr=0, NbLignErr=0;
            boolean bOk = false;
            
            try {
                fluxEntree = new BufferedReader(new FileReader(new File(fichierLu)));
                
                while (ligneLue != null) { 
                    try {
                        if (ligneLue.matches("/filevaults/.*/ZINT315.*")) {
                            bOk = true;
                            aLignes.add(ligneLue);
                            NbLignExtr++;  
                        }
                        
                        if (ligneLue.matches("")) {
                            bOk = false;
                        }
                        
                        if (bOk == true) {
                            if (ligneLue.matches("R.*")) { 
                                aLignes.add(ligneLue.replace("|", ";"));
                                NbLignExtr++;
                                NbLignErr++;
                            }
                        }
                        
                        ligneLue = fluxEntree.readLine();
                        NbLigneSource++;
                    }
                    catch (Exception eLec) {
                        System.out.println("Erreur lecture ligne : " + eLec.getMessage());
                    }
                }//fin while ligne
                
                try {
                    Analyse_Fichier.ecrireFichier(fichierEc, aLignes);
                }
                catch (Exception eEc){
                    System.out.println("Erreur ecriture : " + eEc.getMessage());
                }
                fluxEntree.close();
                
                System.out.println("Fin de fichier");
                System.out.println("Nombre lignes fichier source : " + NbLigneSource);
                System.out.println("Nombre lignes extraites : " + NbLignExtr);
                System.out.println("Nombre lignes d'erreurs : " + NbLignErr);
                
            }   
            catch (FileNotFoundException eFnt) {
                System.out.println("Fichier non trouvé" + eFnt.getMessage());
            }
            catch (IOException eFc) {
                System.out.println(eFc.getMessage());
            }         
        } //fin main
        
        
        public static void ecrireFichier(String fichierEc, List<String> aLignes){
            Writer fluxSortie = null;
    		try {
    			fluxSortie = new PrintWriter(new BufferedWriter(new FileWriter(fichierEc)));
    			for(int i=0;i<aLignes.size();i++){
    				fluxSortie.write(aLignes.get(i)+"\n");
    			}
    		}
    		catch(IOException exEc){
    			System.out.println("Erreur écriture : " + exEc.getMessage());
    		}
    		try {
    			fluxSortie.close();
    		}
    		catch(IOException exFr){
                System.out.println("Erreur fermeture flux de sortie : " + exFr.getMessage());
            }
        } //fin ecrireFichier
    
    } //fin class Analyse_Fichier
    Si quelqu'un a une solution pour sélectionner les colonnes, je suis toujours preneur.

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 401
    Par défaut
    Euh, tu peux sélectionner les colonnes avec un arraylist aussi, non?

    Enfin c'était bizarre ton truc, je n'ai pas vraiment compris le problème.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

Discussions similaires

  1. Convertir une string en tableau de caractères
    Par alainpeniche dans le forum C++
    Réponses: 4
    Dernier message: 06/01/2007, 21h00
  2. Réponses: 1
    Dernier message: 24/12/2005, 15h18
  3. String comme tableau de caracteres
    Par malek_dz77 dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 10/12/2005, 20h11
  4. char *, string et tableau statique ou dynamique
    Par salseropom dans le forum C
    Réponses: 2
    Dernier message: 05/12/2005, 12h33
  5. problème our passer des string dans tableau d'int
    Par Battosaiii dans le forum C++
    Réponses: 9
    Dernier message: 15/07/2004, 18h42

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