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++ Discussion :

Lecture fichiers textes, comment ignorer partie du nom du fichier


Sujet :

C++

  1. #1
    Invité
    Invité(e)
    Par défaut Lecture fichiers textes, comment ignorer partie du nom du fichier
    Bonjour,


    J'aimerais réaliser une opération assez simple mais je ne trouve pas de solution. Je souhaiterais lire plusieurs fichiers textes qui contiennent des données sous un certain format mais dont le nom est variable.

    Par exemple:
    fichier1_abc.txt
    fichier2_def.txt
    fichier3_ghi.txt
    etc.

    Je sais créer les noms de fichiers jusqu'au numéro mais je ne sais pas comment ignorer ce qu'il y a entre le numéro et le .txt.

    Si quelqu'un à une idée ça me dépannerait beaucoup.

    Merci d'avance

  2. #2
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    Bonjour,
    Tu veux dire que tu dois lire des fichiers dont le nom suit le format suivant :
    fichierNXXX.txt
    N est un nombre et XXX est une chaîne quelconque ?

  3. #3
    Invité
    Invité(e)
    Par défaut
    Oui. Enfin pour être exact le nom des fichiers est:
    NOMnID.txt
    où NOM est un nom (chaine de caractères) commun à tous les fichiers, n un nombre (variable mais en progression logique: 0,1,2...) , ID un identifiant variable d'un fichier à l'autre.
    J'espère être clair...

    Merci

  4. #4
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    Si tu n'as aucun moyen de déterminer la partie identifiant, il te faudra parcourir le dossier qui contient les fichiers, et chercher ceux qui correspondent au motif.

    Ça se fait assez bien en C standard (opendir, readdir, fnmatch, etc., éventuellement scandir).
    Pour le C++, il n'y a rien de standard.
    Mais je crois avoir vu passer des bibliothèques de parcours de dossiers ou d'arborescence dans la partie Téléchargements du forum (je ne sais plus si c'était en C ou C++).

    Ou sinon, tu peux utiliser un framework.
    Qt le propose.
    Peut-être que boost aussi, je ne connais pas bien.
    Il y en a probablement d'autres, mais je ne les connais pas.

    Bon courage !

  5. #5
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Salut

    Comme le dit Steph_ng8, le mieux est de parcourir la liste et de la trier pour extraire les bons noms de fichiers. Je te file un exemple fait avec boost.

    Le répertoire contient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    .
    ..
    fichier1_iok.txt
    fichier2_kvs.txt
    fichier3_xma.txt
    monfile_quarienavoir.txt
    rep_rienavoirr
    Le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    #include <iostream>
     
    #include <boost/filesystem.hpp>
    #include <boost/regex.hpp>
     
    #include <boost/foreach.hpp>
    #define foreach BOOST_FOREACH
     
    int main(int argc, char* argv[])
    {
      using namespace boost::filesystem;
     
      std::vector< std::string > mes_bons_fichiers;
     
      path p("C:\\temp\\test");
      try
      {
        if(exists(p) && is_directory(p))
        {
          // On parcourt le répertoire s'il existe
          for(directory_iterator it = directory_iterator(p); it != directory_iterator(); it++)
          {
            // Si c'est bien un fichier, on vérifie que son nom correspond
            if(it -> status().type() == regular_file)
            {
              static const boost::regex file_name_format("fichier[0-9]+_[a-zA-Z]{3}\\.txt");
              std::string filename = (it -> path()).filename().string();
     
              // Si le nom est ok, on stocke le nom du fichier
              if(regex_match(filename,file_name_format))
                mes_bons_fichiers.push_back(filename);
            }
          }
        }
      }
      catch (const filesystem_error& ex)
      {
        std::cout << ex.what() << std::endl;
      }
     
      // Affichage des bons fichiers récupérés
      foreach(std::string & fichier, mes_bons_fichiers)
        std::cout << fichier << std::endl;
     
      return 0;
    }
    Le programme affiche en sortie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fichier1_iok.txt
    fichier2_kvs.txt
    fichier3_xma.txt
    Toute la subtilité consiste à bien écrire l'expression régulière. Pour cet exemple, j'ai utilisé le format que tu nous as donné dans ton premier post.
    Find me on github

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 704
    Points
    2 704
    Par défaut
    Tu peux tout d'abord convertir ta chaîne en vecteur de caractères :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    std::string s = "pouet";
    std::vector<unsigned char>( s.begin(), s.end() );
    Ensuite, utiliser dans la bibliothèque <algorithm>, utiliser la fonction mismatch() sur deux chaînes quelconques de ta liste. Tu sauras ainsi isoler le préfixe.

    Ensuite, sur le reste de la chaîne, tu peux utiliser std::string.find() pour récupérer la position du caractère _. Tu peux ainsi isoler la partie issue de la séquence numérique, et le suffixe constitué de lettres.

    Tu peux encore utiliser find() pour trouver la position du point.

    Mais je n'ai pas bien compris ce que tu cherchais à faire...

  7. #7
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    Citation Envoyé par oodini Voir le message
    Mais je n'ai pas bien compris ce que tu cherchais à faire...
    Son programme doit être capable de lire des fichiers dont une partie du nom (le suffixe en question) est inconnue a priori.

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 704
    Points
    2 704
    Par défaut
    Citation Envoyé par Steph_ng8 Voir le message
    Si tu n'as aucun moyen de déterminer la partie identifiant, il te faudra parcourir le dossier qui contient les fichiers, et chercher ceux qui correspondent au motif.
    [...]
    Peut-être que boost aussi, je ne connais pas bien.
    Boost.FileSystem

  9. #9
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Citation Envoyé par oodini Voir le message
    Tu peux tout d'abord convertir ta chaîne en vecteur de caractères :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    std::string s = "pouet";
    std::vector<unsigned char>( s.begin(), s.end() );
    Ensuite, utiliser dans la bibliothèque <algorithm>, utiliser la fonction mismatch() sur deux chaînes quelconques de ta liste. Tu sauras ainsi isoler le préfixe.

    Ensuite, sur le reste de la chaîne, tu peux utiliser std::string.find() pour récupérer la position du caractère _. Tu peux ainsi isoler la partie issue de la séquence numérique, et le suffixe constitué de lettres.

    Tu peux encore utiliser find() pour trouver la position du point.

    Mais je n'ai pas bien compris ce que tu cherchais à faire...
    Mouai c'est un peu de la bricole ça et c'est dommage quand les regex font tout le boulot.
    Find me on github

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 704
    Points
    2 704
    Par défaut
    Ce n'est pas de la bricole. Je n'ai fait aucun usage détourné des outils évoqués.

    Et ça permet d'éviter de se trimballer une bibliothèque.

Discussions similaires

  1. Réponses: 1
    Dernier message: 02/09/2014, 11h10
  2. [XL-2010] Extraire des caractères à un nom de fichier et prendre en compte le nom de fichier
    Par Malcomiix dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 18/03/2013, 16h51
  3. [JTable] Comment récuperer les données d'un fichier texte ?
    Par Makunouchi dans le forum Composants
    Réponses: 2
    Dernier message: 03/05/2005, 16h37
  4. Réponses: 5
    Dernier message: 25/01/2005, 14h26
  5. Comment faire une insertion dans un fichier texte ?
    Par Isa31 dans le forum Langage
    Réponses: 10
    Dernier message: 28/12/2004, 09h06

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