|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Développeur informatique Inscription : décembre 2012 Messages : 7 ![]() |
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 |
|
|
00
|
|
|
#2 |
|
Expert Confirmé Sénior
![]() |
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. |
|
|
00
|
|
|
#3 |
|
Invité de passage
![]() Développeur informatique Inscription : décembre 2012 Messages : 7 ![]() |
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. |
|
|
00
|
|
|
#4 | |||
|
Invité de passage
![]() Développeur informatique Inscription : décembre 2012 Messages : 7 ![]() |
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 :
Le premier affichage, lorsque je rempli mon arrayList est correcte (tous les champs de toutes les lignes) Citation:
|
|||
|
|
00
|
|
|
#5 | ||
|
Invité de passage
![]() Développeur informatique Inscription : décembre 2012 Messages : 7 ![]() |
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 :
|
||
|
|
00
|
|
|
#6 |
|
Expert Confirmé Sénior
![]() |
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. |
|
|
00
|
|
|
#7 | |||||||
|
Invité de passage
![]() Développeur informatique Inscription : décembre 2012 Messages : 7 ![]() |
bonjour Médinoc et merci pour ton suivi,
Je récapitule : j'arrive à faire une liste de mes lignes lues dans mon fichier .dat et à les écrire dans un fichier .cvs tout simplement en remplaçant le séparateur de champs "|" par un ";". Voici les lignes de code concernées : Code :
Mais j'aurais aussi besoin de mettre ces lignes en tableau pour des traitements ultérieurs. Mon idée était donc de créer un autre ArrayList mais de String[] et de Spliter chaque ligne. Mais là, je bloc... J'ai pourtant bien rajouter une boucle dans la boucle "tant que ligne suivante" pour traiter chaque champ de la ligne. Je ne trouve pas comment déclarer puis créer mon tableau avec un nombre de colonne qui n'est connu qu'au traitement de la première ligne. J'ai aussi essayé avec StringTokenizer mais toujours bloqué. C'est pourtant pas faute d'avoir cherché sur le net et essayé toutes sortes de choses. J'ai aussi essayé en créant un tableau à 2 dimensions mais rien à faire. Sachant que le nombre de lignes et de colonnes n'est pas connu au départ et que certains champs de mes lignes splitées sont vides. Les lignes de mon arrayList que je voudrais splitter pour faire un arrayList<String[]> : Citation:
Code :
Code :
J'ai déjà fait des ArrayList<String[]> et des tableaux à 2 dimensions mais jamais en ne connaissant pas le nombre de colonnes au départ ni en Splitant une String et là, je rame. Je pense avoir déjà été plus près du but qu'avec ce dernier code mais j'ai fait tellement de tests différents que je n'ai pas tout gardé. Votre aide est donc vraiment la bienvenue ! |
|||||||
|
|
00
|
|
|
#8 |
|
Expert Confirmé Sénior
![]() |
Déjà, pourquoi utiliser un StringTokenizer quand tu peux utiliser String.split?
__________________
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. |
|
|
00
|
|
|
#9 | ||||
|
Invité de passage
![]() Développeur informatique Inscription : décembre 2012 Messages : 7 ![]() |
J'ai essayé avec le Split mais Split("|") = Split à chaque caractère.
J'ai donc essayé avec ligneLue = ligneLue.replace("|", ";"). Là ça marche - mais je pense que je fais une erreur soit dans ma boucle de remplissage, soit dans ma boucle de lecture. Remplissage : Code :
Code :
|
||||
|
|
00
|
|
|
#10 | ||
|
Expert Confirmé Sénior
![]() |
Ah, ce doit être le coup du split() Java qui prend une regex en paramètre au lieu d'une chaîne simple.
Je ne connais que peu le Java, mais je pense que tLignes.get(j); tout seul ne fait pas grand-chose. Code Java :
__________________
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. |
||
|
|
10
|
|
|
#11 | ||||||||
|
Invité de passage
![]() Développeur informatique Inscription : décembre 2012 Messages : 7 ![]() |
Merci beaucoup Médinoc, j'y suis enfin arrivé
![]() Pour le Split, c'est surement comme tu dis car ça marche nickel sauf avec le tube ("|"). Pour le reste, je faisais une boucle de trop au remplissage. Je déclare et créé mes ArrayList (une de String pour le csv et une de String[] pour les traitements) : Code :
Code :
Code :
Maintenant j'arrive aussi à n'afficher qu'une colonne de mon ArrayList de tableaux (le but de ce code en fait) : Code :
|
||||||||
|
|
00
|
Copyright © 2000-2013 - www.developpez.com