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

C++Builder Discussion :

Extraction ligne d'un fichier text


Sujet :

C++Builder

  1. #1
    Membre du Club Avatar de bhahmed
    Inscrit en
    Août 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Août 2006
    Messages : 84
    Points : 41
    Points
    41
    Par défaut Extraction ligne d'un fichier text
    bonjour,
    j'ai un fichier text dont je veux extraire des lignes et le contenu des lignes est variable.

    voici un exemple du contenu du fichier :
    fixup protocol dns maximum-length 512
    fixup protocol ftp 21
    fixup protocol h323 h225 1720
    fixup protocol h323 ras 1718-1719
    fixup protocol http 80
    fixup protocol rsh 514
    fixup protocol rtsp 554
    fixup protocol sip 5060
    fixup protocol sip udp 5060
    fixup protocol skinny 2000
    fixup protocol smtp 25
    fixup protocol sqlnet 1521
    fixup protocol tftp 69
    names
    access-list 107 permit ip 192.16.10.0 255.255.255.0 112.240.100.0 255.255.255.0
    access-list secout permit icmp any any echo-reply
    access-list secout permit icmp any any echo
    access-list secin permit icmp any any echo
    access-list secin permit icmp any any echo-reply
    access-list secin permit tcp any any eq 1433
    access-list secin permit tcp any any eq smtp
    access-list secin permit tcp any any eq imap4
    access-list secin permit tcp any any eq www
    access-list zonecommune permit ip 192.16.10.0 255.255.255.0 10.10.10.0 255.255.255.0
    access-list zonecommune permit ip 192.16.10.0 255.255.255.0 112.240.100.0 255.255.255.0
    pager lines 24
    mtu outside 1500
    mtu inside 1500
    ip address outside 112.240.100.6 255.255.255.0
    ip address inside 192.16.10.1 255.255.255.0
    ip audit info action alarm
    ip audit attack action alarm
    voici le code pour la lecture du fichier que j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     ifstream inter(OpenDialog1->FileName.c_str());
                   inter >> essai;
    je veux extraire que les lignes contenant les acess-list

    merci pour votre aide

  2. #2
    Membre actif Avatar de damienlann
    Profil pro
    Étudiant
    Inscrit en
    Mai 2005
    Messages
    293
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2005
    Messages : 293
    Points : 249
    Points
    249
    Par défaut
    salut....
    tu as essayé quelque chose ou tu veux que l'on te le fasse ???...

  3. #3
    Membre du Club Avatar de bhahmed
    Inscrit en
    Août 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Août 2006
    Messages : 84
    Points : 41
    Points
    41
    Par défaut
    j'ai pas pu le faire
    j'ai essaye avec le "if" mais je n'arrive pas a extraire toute la ligne
    j'ai essaye aussi avec le fget mais je n'ai pas réussi
    je veux juste des indications
    Merci

  4. #4
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut
    Salut,
    Tu charges le fichier dans un TStringList, tu travail sur toute la ligne. Tu testes ce que tu veux et tu extrais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
       int ligne;
       TStringList *Fichier = new TStringList();
       Fichier->LoadFromFile("C:\\...File.txt");
     
       for(ligne=0;ligne<Fichier->Count;ligne++)                 //recherche sur le fichier
           if(Fichier->Strings[ligne].Pos("access-list") != 0)   //teste de la ligne
              ListBox1->Items->Add(Fichier->Strings[ligne]);  //recopie
    Ici, je copie la ligne entière dans un listeBox.

  5. #5
    Membre du Club Avatar de bhahmed
    Inscrit en
    Août 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Août 2006
    Messages : 84
    Points : 41
    Points
    41
    Par défaut
    merci ça marche;
    le principe c'est une recherche du mot acces-list ds les lignes?

    et si je veux seulement les lignes commençant pas le mot "access-list" ?
    et je peux faire un taitement sur les lignes : par exemple extraire chaque champs a part ???

  6. #6
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut
    C'est ca.
    Pour le traitement tu as:
    - int AnsiString.Pos(AnsiString) qui cherche la chaine donné en paramètre et te renvoi l'indice premier caractère, sinon 0.
    - int AnsiString.Length() qui cherche la taille de la chaine.
    - int AnsiString.SubString(int index,int count) qui donne la chaine à partir de l'index, et de count caractères.
    - int AnsiString.SubString(int index,int count) qui supprime à partir de l'index, et de count caractères.

  7. #7
    Membre du Club Avatar de bhahmed
    Inscrit en
    Août 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Août 2006
    Messages : 84
    Points : 41
    Points
    41
    Par défaut
    l'indice 0 veut dire qu'il n'a pas touvé la chaine qu'il cherche ???
    ou bien la position de la chaine trouvé ??
    car j'ai des lignes qui contiennent le chaine recherchée mais que je n'ai pas besoin.
    et est ce que je peux extraire les champs des lignes (séparateur " " ) ?
    Merci beaucoup

  8. #8
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Si tu fait reference à la méthode Pos(), le 0 veut dire qu'il n'a pas trouvé la chaine recherhcé, tout autre valeur est la position du premier caractère de la chaine cherché dans la chaine ou l'on cherche, mais une petite recherche dans l'aide de bcb t'aurai donné la solution .

  9. #9
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut
    J'ai fait une petite boulette: la dernière fonction, c'est Delete que je voulais mettre et pas SubString une deuxième fois.


    Notre ami pottiez a parfaitement répondu à ta question.
    J'ajoute juste une petite info: une chaine de type AnsiString est dynamique, et elle ne contient pas de caractère de fin de chaine.
    Si tu pointes au delà de sa zone, tu génères une erreur. Pour éviter ca, il faut savoir que le premier caractère est à l'indice 1 (et pas 0 comme pour un char) et elle contient Length() caractères (pour un char, on a '\0' à la fin).

    C'est pourquoi 0 signifie qu'il n'a pas trouvé la chaine.

    Pour ton autre question, tu peux supprimer ce que tu veux. Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    AnsiString chaine = "bonjour tout le monde"
    chaine.Delete(chaine.Pos(" "),1);
    On supprime le premier caractère " ". On aura donc en résultat "bonjourtout le monde" au lieu de "bonjour tout le monde".

  10. #10
    Membre du Club Avatar de bhahmed
    Inscrit en
    Août 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Août 2006
    Messages : 84
    Points : 41
    Points
    41
    Par défaut
    merci

  11. #11
    Membre du Club Avatar de bhahmed
    Inscrit en
    Août 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Août 2006
    Messages : 84
    Points : 41
    Points
    41
    Par défaut
    Merci bandit boy
    moi je ne veux pas supprimer mais je veux mettre les différents champs de chaque ligne séparer par " " dans des balises XML.

    Est ce que c'est possible de le faire ??

  12. #12
    Membre du Club Avatar de bhahmed
    Inscrit en
    Août 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Août 2006
    Messages : 84
    Points : 41
    Points
    41
    Par défaut
    pour éliminer les lignes dont le mot de recherche ne se trouve pas au début de la ligne il faut juste ajouter la condition suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     if((Fichier->Strings[ligne].Pos("access-list") != 0) && (Fichier->Strings[ligne].Pos("access-list") <2) )   //teste de la ligne
             { ListBox1->Items->Add(Fichier->Strings[ligne]);  //recopie
               //  ListBox1->Items->Add(Fichier->Strings[ligne].Pos("access-list"));
              }

  13. #13
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut
    C'est ca, tu peux même préciser ==1 vu que tu cherches à ce que ce soit le premier caractère qui corresponde au début de ta chaine.

    Pour tes balises XML, je ne comprend pas (je ne connais pas le XML, ), mais si tu me fais un exemple sur une ligne, je peux te dire comment faire.

  14. #14
    Membre du Club Avatar de bhahmed
    Inscrit en
    Août 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Août 2006
    Messages : 84
    Points : 41
    Points
    41
    Par défaut
    merci beaucoup
    j'ai recopié les lignes des un fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       reg << Fichier->Strings[ligne].c_str();
    et maitenant je fai l'extraction depuis le fichier intermédiaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rego >> type >> Nom >> Droit >> Prot >> addS >> addD;
    mais j'ai une question bête
    comment comparer 2 chaines de caractères
    j'ai essaye avce == mais ça ne marche

    car j'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (Prot == "icmp")rego >> serv;

  15. #15
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut
    Il se peut que tes chaines n'ai pas la même longueur et c'est pour ca que ca ne marche pas.
    Fais un test simple comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        AnsiString chaine1 = Edit1->Text,
                      chaine2 = Edit2->Text;
        if(chaine1 == chaine2)   ListBox1->Items->Add("Chaine 1 et 2 identiques");
        else                            ListBox1->Items->Add("Chaine 1 et 2 différentes");
    Tu verras que ton soucis viens peut être de là, sinon ca marche très bien.

  16. #16
    Membre du Club Avatar de bhahmed
    Inscrit en
    Août 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Août 2006
    Messages : 84
    Points : 41
    Points
    41
    Par défaut
    tu as raison.
    moi je déclare les variables comme suit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char type[30],Nom[30],Droit[30],Prot[25],addS[30],addD[30],serv[30],op[30];
    et comme je lis depuis un fichier, il n'accepte pas le AnsiString.
    voici la partie ou j'utilise la comparaison :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (int k =0; k<8; k++) {
    rego >> type >> Nom >> Droit >> Prot >> addS >> addD;
    if (Prot == "icmp")rego >> serv;
    if (Prot == "tcp") {rego >> op >> serv;}
    et la c'est le contenu du fichier dont j'extrait les données :
    access-list 107 permit ip 172.16.10.0 255.255.255.0 200.240.100.0 255.255.255.0
    access-list secout permit icmp any any echo-reply
    access-list secout permit icmp any any echo
    access-list secin permit icmp any any echo
    access-list secin permit icmp any any echo-reply
    access-list secin permit tcp any any eq 1433
    access-list secin permit tcp any any eq smtp
    access-list secin permit tcp any any eq imap4
    access-list secin permit tcp any any eq www
    access-list zonecommune permit ip 172.16.10.0 255.255.255.0 10.10.10.0 255.255.2
    access-list zonecommune permit ip 172.16.10.
    comme pour chaque ligne il n'y pas le même nombre de champs donc je dois les différencier par le champs protocole (ip,TCP,ICMP....)

    je ne sais plus koi faire

  17. #17
    Membre du Club Avatar de bhahmed
    Inscrit en
    Août 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Août 2006
    Messages : 84
    Points : 41
    Points
    41
    Par défaut
    c'est bon j'ai trouvé la solution
    j'ai créé une variable de type AnsiString et je lui ai assigné la valeur du char et comme ça la comparaison marche très bien
    et je suis très heureux

  18. #18
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut
    Nikel,
    sinon pour comparer des variable de type char, il te faut utiliser la fonction strcmp pour string compare.

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

Discussions similaires

  1. [shell] Extraction sélective de lignes d'un fichier texte
    Par kinder_pingui dans le forum Linux
    Réponses: 4
    Dernier message: 01/06/2010, 08h06
  2. [Batch] Extraction de la première ligne d'un fichier texte?
    Par brolon dans le forum Scripts/Batch
    Réponses: 5
    Dernier message: 12/05/2010, 14h35
  3. [BATCH] lire chaque ligne d'un fichier texte
    Par bartmarley dans le forum Windows
    Réponses: 13
    Dernier message: 22/04/2005, 21h01
  4. [Fichier] Nombre de ligne dans un fichier texte
    Par NewSer dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 10/11/2004, 16h58
  5. Réponses: 2
    Dernier message: 02/03/2004, 19h38

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