Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1449 connectés 

  FORUM HardWare.fr
  Programmation
  Java

   Pattern Java | Probleme ecriture dans fichier texte.

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Pattern Java | Probleme ecriture dans fichier texte.

n°1907225
raxzor
Posté le 21-07-2009 à 14:21:42  profilanswer
 

Salutations peuplade !
 
Dites moi, je suis à la recherche d'un pattern Java pour la recherche d'une chaîne de caractère bien spécifique par l'intermédiaire d'un matcher.
 
Voici ce que je recherche  :      
ex : [110/3]
 
En outre il faut que mon pattern corresponde à un crochet suivi de 110 suivi d'un slash, suivi d'un nombre quelconque, lui-même suivi d'un crochet fermé.
Dans l'exemple seul le 3 est variable.
 
J'ai essayé un machin bizzare du style : Pattern p = Pattern.compile("[110/\\d]" );
Sans succès.
 
Merci de votre aide !!
 
Regards


Message édité par raxzor le 29-07-2009 à 14:32:29
mood
Publicité
Posté le 21-07-2009 à 14:21:42  profilanswer
 

n°1907247
raxzor
Posté le 21-07-2009 à 14:37:50  profilanswer
 

En recherchant un petit peu plus profondement sur internet, j'ai trouvé la solution :  
 
 Pattern p = Pattern.compile("\\d+(?=\\])" );
 
Ce qui permet de reconnaître un entier qui est suivi par un crochet.
En l'occurence dans mon exemple du message posté ci dessus, cela permet de chercher le 3, qui est variable.
 
Voici de plus le lien vers le site ou j'ai trouvé la solution : http://prevert.upmf-grenoble.fr/Pr [...] ieres.html
 
Merci !
 
Bonne apres midi !

n°1907291
Bidem
Posté le 21-07-2009 à 15:50:48  profilanswer
 

Et par rapport à ton 1er essai, il ça ne suffisait pas de juste déspécialiser les crochets ?

Code :
  1. Pattern p = Pattern.compile("\\[110/\\d\\]" );

n°1907298
raxzor
Posté le 21-07-2009 à 16:11:00  profilanswer
 

Salut, je viens d'essayer ce que tu as proposé :  
 
Résultat, il ne m'affiche que : [110/3] et non un ensemble de résultat voulu.
 
Alors qu'avec Pattern p2 = Pattern.compile("\\d+(?=\\])" ); il m'affiche :
12
52
52
3
100
22
 
Sachant que ce sont ces numéros qui me sont utiles (nombre de sauts, en routage OSPF pour les curieux) et issus de :
[110/12]
[110/52]
[110/52]
[110/3]
[110/100]
[110/22]
 
Étrange, je ne voit pas pourquoi il ne m'affiche que [110/3].
 
Cdt,
 
Romain.

n°1907335
Bidem
Posté le 21-07-2009 à 17:13:57  profilanswer
 

Parce que [110/3] est le seul où le nombre variable est à 1 seul chiffre :p
 

Code :
  1. Pattern p = Pattern.compile("\\[110/\\d+\\]" );


avec un '+' derrière le \d ça doit mieux marcher
 

n°1907566
raxzor
Posté le 22-07-2009 à 11:36:05  profilanswer
 

Exact ! Bien vu ! :)

n°1907696
raxzor
Posté le 22-07-2009 à 16:43:15  profilanswer
 

Re Bonjour, je fait face à un problème, je m'explique, mais tout d'abord voici le code :  

Code :
  1. class FirstApp
  2. {
  3.    @SuppressWarnings("null" )
  4.    public static void main (String[] args)
  5.    {
  6.     final String adresse = "J1.txt";  //fichier contenant les lignes extrait de la configuration d'un routeur.
  7.     try
  8.     {
  9.      final File fichier_inser = new File("route.txt" );
  10.   
  11.      if(fichier_inser.exists() == false) //si le fichier route.txt n'existe pas, le créer.
  12.   try {
  13.    fichier_inser.createNewFile();
  14.   } catch (IOException e1) {
  15.    // TODO Auto-generated catch block
  16.    e1.printStackTrace();
  17.   }
  18.      String adresse2 = "route.txt"; //adresse du fichier à analyser.
  19.  InputStream ips=new FileInputStream(adresse);
  20.  InputStreamReader ipsr=new InputStreamReader(ips);
  21.  BufferedReader br=new BufferedReader(ipsr);
  22.  String ligne;
  23.  String texte="";
  24.  while ((ligne=br.readLine())!=null)
  25.  {
  26.    String[] result = ligne.split("\\s" );
  27.    String[] tab= new String[500];
  28.    int x=0;
  29.    int i=0;
  30.    while (x<result.length)
  31.    {
  32.    Pattern p = Pattern.compile("(?!255)(\\d{1,3}\\.){3}\\d{1,3}" ); //recupere les adresses IP
  33.    Pattern p2 = Pattern.compile("\\d+(?=\\])" ); // récupère le coût (ex:52)
  34.    //Pattern p2 = Pattern.compile("\\[110/\\d+\\]" );
  35.    Matcher m = p.matcher(result[x]);
  36.    Matcher m2 = p2.matcher(result[x]);
  37.    String texte2="";
  38.    String texte3="";
  39.     while (m.find())
  40.     {
  41.      System.out.println(m.group()); //affiche la chaîne de caractère recherché, qui a été trouvé.
  42.      FileWriter fw = new FileWriter(adresse2,true); BufferedWriter output = new BufferedWriter(fw);
  43.      output.write(m.group());  //écrit la chaîne trouvé dans le fichier route.txt
  44.      output.flush();
  45.      output.close();
  46.     }
  47.     while (m2.find())
  48.     {
  49.      System.out.println(m2.group()); //affiche la chaîne de caractère recherché, qui a été trouvé.
  50.      FileWriter fw = new FileWriter(adresse2,true); BufferedWriter output = new BufferedWriter(fw);
  51.      output.write(m2.group()); //écrit la chaîne trouvé dans le fichier route.txt
  52.      output.flush();
  53.      output.close();
  54.     }
  55.     x++;
  56.    } //fin de la seconde boucle while  
  57.  }//fin de la premiere boucle while  
  58.  br.close();
  59. }
  60. catch (Exception e){
  61.  System.out.println(e.toString());
  62. }
  63.    } 
  64. }


 
 
 
Lorsque l'execution se termine, mon fichier texte ressemble à ceci :  


 
223.0.70.0
12
 
172.16.50.241
 
 
 
 
 
 
 
192.168.120.4
52
 
172.16.20.41
 
 
 
 
 
 
 
192.168.180.205
151
 
172.16.21.200
 
 
 
 
 
 
 
192.168.150.123
151
 
172.18.41.2


 
Mon soucis est le suivant :  
-pourquoi ces espaces ?  
-est-il possible de transformer chaque bloc d'information ?
exemple :
 
on a ceci :
 
192.168.150.123
151
 
172.18.41.2
 
on aimerait ceci :
 
192.168.150.123 151 172.18.41.2
 
 
Merci pour la lecture et pour votre aide, je galère depuis hier, j'ai essayer de stocker dans un premier temps les valeurs dans un tableau, une ou deux dimensions, ou bien de concatener la totalité d'un bloc en un String.
 
 
 
 
 

n°1907711
Bidem
Posté le 22-07-2009 à 17:21:50  profilanswer
 

-pourquoi ces espaces ?
 
ça dépend fortement de ton fichier en entrée
 
-est-il possible de transformer chaque bloc d'information ?
Cf. Stringbuilder
 
Petits conseils sur les performances, tu peux mettre certaines initialisation en dehors de tes boucles :
     - la création/compilation des Pattern
     - la création du FileWriter du fichier de sortie

n°1907719
raxzor
Posté le 22-07-2009 à 17:36:52  profilanswer
 

Mon fichier en entrée n'a aucun saut de ligne, d'ou mon interrogation.
 
En ce qui concerne la transformation des blocs de données, je te remercie, je vais regarder tout ça, de même pour les performances !
 
A bientôt  

n°1908098
raxzor
Posté le 23-07-2009 à 19:42:31  profilanswer
 

Bonsoir à tous,  
Salut Bidem,  
 
j'ai suivi tes conseils, au sujet de l'optimisation des performances.
Certaines déclarations sont désormais hors des boucles while. (Pattern...)
Cependant il m'est impossible de déclarer les FileWriter et BufferedWriter hors de ces boucles, sous peines de récupérer une erreur "Stream closed" par le Catch.
 
Je suis aussi maintenant à la recherche d'un Pattern.
Ce Pattern porte sur la seconde chaîne de caractère de chaque ligne de mon fichier, elle même contenant seulement et exclusivement deux caractères. Le premier caractère étant un "O" (la lettre pas le chiffre ;))
Je suis sur une piste, mais malheureusement non positive : Pattern p = Pattern.compile("(O)\\s\\d+");
 
Ne comprenant pas trop l'intérêt de StringBuilder, (mise à part la rapidité d'exécution par rapport au nombre d'opération effectuées par  une simple concaténation) car mon problème persiste, je voudrais savoir si ce soucis de sauts de lignes dans le fichier de sortie ne surviendrait pas lors de l'analyse de chaque ligne ne contenant pas ce que je recherche. (insertion de caractères vide et non null  :??: )
 
Merci pour la lecture et pour l'aide que vous m'apporter. :hello:  
 
Cdt,
 
R
 
-------------------------------------------------------------------------------------------------------------------------------------------------
Edit => Ok pour le problème d'espace j'ai utilisé un StringBuffer :  
 

Code :
  1. while ((ligne=br.readLine())!=null)
  2. {
  3.    String[] result = ligne.split("\\s" );
  4.  
  5.    int x=0;
  6.    StringBuffer buff = new StringBuffer();
  7.  
  8.  
  9.    while (x<result.length)
  10.    {
  11.  
  12.    Pattern p = Pattern.compile("(?!255)(\\d{1,3}\\.){3}\\d{1,3}" );
  13.    Pattern p2 = Pattern.compile("\\d+(?=\\])" );
  14.    Pattern p3 = Pattern.compile("Vlan\\d" );//Vlan
  15.    //Pattern p = Pattern.compile("(O)(\\s\\d+)" );
  16.    Matcher m = p.matcher(result[x]);
  17.    Matcher m2 = p2.matcher(result[x]);
  18.    Matcher m3 = p3.matcher(result[x]);
  19.     while (m.find())
  20.     {
  21.      buff.append(m.group());
  22.      buff.append(" " );
  23.     }
  24.     while (m2.find())
  25.     {
  26.      buff.append(m2.group());
  27.      buff.append(" " );
  28.     }
  29.     while (m3.find())
  30.     {
  31.      buff.append(m3.group());
  32.      buff.append(" " );
  33.     }
  34.  
  35.     x++;
  36.    }
  37.    FileWriter fw = new FileWriter(adresse2,true); BufferedWriter output = new BufferedWriter(fw);
  38.    //output.write(buff);   
  39.    System.out.println(buff);
  40.    String str = buff.toString();
  41.    output.write(str); 
  42.    output.write("\r\n" ); 
  43.    output.flush();
  44.    output.close();
  45. }
  46. br.close();
  47. }


 
Il ne me reste que le Pattern à trouver !  
 
Ciao


Message édité par raxzor le 24-07-2009 à 13:16:56
mood
Publicité
Posté le 23-07-2009 à 19:42:31  profilanswer
 

n°1908955
raxzor
Posté le 27-07-2009 à 14:28:59  profilanswer
 

Je n'arrive pas à trouver le pattern, pourriez vous m'aider ? Merci

n°1908980
Bidem
Posté le 27-07-2009 à 15:04:33  profilanswer
 

Plus haut dans ton code tu fais

Code :
  1. String[] result = ligne.split("\\s" );


 
Donc tu n'auras aucun caractère espace dans tes result[x]
 

n°1909038
raxzor
Posté le 27-07-2009 à 16:02:05  profilanswer
 

Merci Bidem, en effet je n'avais pas compris ce point là.
Voici le pattern qui fonctionne :  
 
Pattern p4 = Pattern.compile("^O.\\p{Upper}\\p{Digit}|\\p{Upper}\\p{Digit}" );
 
Sachant que la première partie après le pipe correspond a une chaine unique a analyser : O*E2 ou le E2 est variables.
Cette recherche est différente de la seconde partie après le pipe : O E2.
 
Merci pour ton éclaircissement en tout cas !  
 
Sujet clos !

n°1909879
raxzor
Posté le 29-07-2009 à 14:32:06  profilanswer
 

Salµtation,
 
Je recherche un Pattern qui me trouve les lignes qui commence par un "[".
 
J'ai essayé

Code :
  1. Pattern p = Pattern.compile("^\\[" );


 
Cependant même si ce caractère ne se trouve pas en début de ligne (mais au milieu par exemple), il m'affiche là ligne.
 
Si je ne me trompe pas, le caractère "^" permet de faire une recherche sur le premier caractère de la ligne.
 
Merci de m'aider, je ne trouve pas la solution.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

   Pattern Java | Probleme ecriture dans fichier texte.

 

Sujets relatifs
[mySQL] problème à l'insertion de polygoneImporter plusieurs csv sous access avec fichier .ini
probleme avec fck editorTri d'un fichier
Installation appli Java sur Mobile[résolu]recherche dans un fichier encodé en utf8
Creation de fichier composé de plusieurs autresgros fichier excel copier et inserer des lignes
Aide sur traitement du fichierproblème avec fsockopen()
Plus de sujets relatifs à : Pattern Java | Probleme ecriture dans fichier texte.


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR