Modification d'un fichier

Résolu
cs_ghofrane Messages postés 44 Date d'inscription mardi 18 juillet 2006 Statut Membre Dernière intervention 11 août 2009 - 21 nov. 2007 à 14:12
cs_ghofrane Messages postés 44 Date d'inscription mardi 18 juillet 2006 Statut Membre Dernière intervention 11 août 2009 - 29 nov. 2007 à 09:58
Bonjour,
je possède un fichier texte qui a cette structure :

# mon routeur 8
define host{
use linux_server
host_name routeur8
alias routeurout
address 192.168.8.1
}

# mon routeur 9
define host{
use linux_server
host_name routeur9
alias routeurin
address 192.168.54.1
}

et en possédant une adresse ip je dois parcourir le fichier et supprimer tout le bloc concernant cette adresse.
j'ai utilisé deux fichiers mais le problème est que il ya des lignes à supprimer avant d'arriver à l'adresse et une ligne par la suite. je lis le fichier en séquentiel normalemnt et je stocke dans un autre fichier.
Donc je ne supprime qu'une ligne et je garde tjs une partie du bloc.

Merci de votre aide.

5 réponses

Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
21 nov. 2007 à 15:13
Salut,

commence par lire ton fichier en te basant sur les blocs soit '{' et '}' tu peux le faire assez simplement à l'aide d'un petit regexp ensuite tu te fais un objet représentant un bloc et tu gagnera ton temp...
voici la regexp que tu peux utiliser :
[...]
//lecture du fichier
StringBuilder builder = new StringBuilder();
final Scanner sc = new Scanner(new FileInputStream(fileName));
while (sc.hasNext())
    builder.append(sc.nextLine().trim());
sc.close();
builder.trimToSize();
//préparation de la regexp
final Pattern p = Pattern.compile("\\{[^\\}\\{]*\\}");
Matcher m = p.matcher(builder.toString());int begin 0, end 0;
//parse l'expression
while (m.find()) {
    begin = m.start();
    end = m.end();
    [...]//ici tu commence à analyser le bloque
    //prépare pour le prochain bloc
    builder = new StringBuilder(builder.substring(end));
    m = p.matcher(builder);
}
[...]
si tu veux une idée de ce que tu peux faire, tu peux regarder ce poste ICI

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
3
KenZara Messages postés 112 Date d'inscription vendredi 24 décembre 2004 Statut Membre Dernière intervention 20 décembre 2011
21 nov. 2007 à 15:18
Bonjour,

Je vais essayer de récapituler ce que tu veux faire pour mieux comprendre:
Tu as un fichier qui contient par exemple:

define host{
    use linux_server
    host_name routeur8
    alias routeurout
    address 192.168.8.1
}

Tu veux que si l'adresse est le 192.168.8.1, supprimer tout le bloc à partir de "define host" jusqu'au " } " ?
Si tel est ton souhait, il y a une facon de faire, c'est de récupérer à chaque fois le bloc en entier dans un String (Donc define host { ......... } ) et voir si ton String contient bien l'adresse que tu cherches, si tel est le cas, tu supprimers le bloc (ou tu ne l'écris pas ds ton nouveau fichier) sinon tu l'ajoutes.

Kenza
0
cs_ghofrane Messages postés 44 Date d'inscription mardi 18 juillet 2006 Statut Membre Dernière intervention 11 août 2009
21 nov. 2007 à 15:48
salut,
merci pour vos réponses.
Je vais essayer de faire comme vous dites.
Merci encore.
0
cs_ghofrane Messages postés 44 Date d'inscription mardi 18 juillet 2006 Statut Membre Dernière intervention 11 août 2009
28 nov. 2007 à 12:43
bonjour,
j'ai essayé de faire en regexp et j'ai juste modifier ton code en ajoutant une partie pour l'analyse du bloc:

try {                File file = new File ("/home/user/host.txt");
                                 //lecture du fichier
                               StringBuilder builder = new StringBuilder();
                               final Scanner sc = new Scanner(new FileInputStream("/home/user/host.txt"));
                               while (sc.hasNext())
                               {
                                   builder.append(sc.nextLine().trim());
                               }
                               sc.close();
                               builder.trimToSize();
                               //préparation de la regexp
                               final Pattern p = Pattern.compile("\\{[^\\}\\{]*\\}");
                               Matcher m = p.matcher(builder.toString());                               int begin 0, end 0;
                               //parse l'expression
                               BufferedWriter sortiroutt = new BufferedWriter(new FileWriter("/home/user/routeursupp.txt", true));
                               while (m.find()) {
                                   begin = m.start();
                                   end = m.end();
                                        
                                   //analyser le bloc
                               if(m.equals("192.162.54.150"))
                               {  // écrire le bloc à supprimer dans un autre fichier
                                   BufferedWriter sortirout = new BufferedWriter(new FileWriter("/home/user/routeur_gardé.txt", true));
                                   sortirout.write(builder.toString()+"\n");
                                   sortirout.close();
                               
                                  
                               }
                               else {
                                   // écrire le bloc dans un fichier temporaire
                                       sortiroutt.write(builder+"\n");   
                               }
                               }
                               sortiroutt.close();
                               //prépare pour le prochain bloc
                                   builder = new StringBuilder(builder.substring(end));
                                   m = p.matcher(builder);  
      } catch(java.io.IOException e) {
               e.printStackTrace();
            }
         
Le problème est que à la sotie il me retourne un fichier où il y a plusieurs blocs et répétés plusieurs fois. et il n'arrive pas à supprimer le bloc voulu. mais j'arrive pas à voir comment je peux accéder au bloc et l'analyser. j'ai essayé avec bloc.tostring.containes aussi.

merci beaucoup.

Ps: pour l'analyse du bloc j'ai essayé avec bloc.tostring.containes aussi
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_ghofrane Messages postés 44 Date d'inscription mardi 18 juillet 2006 Statut Membre Dernière intervention 11 août 2009
29 nov. 2007 à 09:58
Bonjour,
merci le problème est résolu:
j'ai juste ajouté:
     String host = m.group();
                                   if (host.contains("192.168.54.150")) {
                                       // Le bloc contient l'adresse IP que l'on ne veut pas
                                       BufferedWriter sortirout = new BufferedWriter(new FileWriter("/home/user/sup.txt", true));
                                         sortirout.write(host+"\n");
                                         sortirout.close();
                                   } else {....}

Merci enore.
                             
0
Rejoignez-nous