Pattern Java | Probleme ecriture dans fichier texte.

Pattern Java | Probleme ecriture dans fichier texte. - Java - Programmation

Marsh Posté le 21-07-2009 à 14:21:42    

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
Reply

Marsh Posté le 21-07-2009 à 14:21:42   

Reply

Marsh Posté le 21-07-2009 à 14:37:50    

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 !

Reply

Marsh Posté le 21-07-2009 à 15:50:48    

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\\]" );

Reply

Marsh Posté le 21-07-2009 à 16:11:00    

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.

Reply

Marsh Posté le 21-07-2009 à 17:13:57    

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
 

Reply

Marsh Posté le 22-07-2009 à 11:36:05    

Exact ! Bien vu ! :)

Reply

Marsh Posté le 22-07-2009 à 16:43:15    

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.
 
 
 
 
 

Reply

Marsh Posté le 22-07-2009 à 17:21:50    

-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

Reply

Marsh Posté le 22-07-2009 à 17:36:52    

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  

Reply

Marsh Posté le 23-07-2009 à 19:42:31    

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
Reply

Marsh Posté le 23-07-2009 à 19:42:31   

Reply

Marsh Posté le 27-07-2009 à 14:28:59    

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

Reply

Marsh Posté le 27-07-2009 à 15:04:33    

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]
 

Reply

Marsh Posté le 27-07-2009 à 16:02:05    

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 !

Reply

Marsh Posté le 29-07-2009 à 14:32:06    

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.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed