Partage
  • Partager sur Facebook
  • Partager sur Twitter

extraire une partie repetitive de différent texte

    1 mai 2024 à 22:44:14

    Bonjour,

    je dois traiter differents fichiers pour en extraire uniquement ce qui m interesse.

    est il possible de parcourir un fichier jusqu à ce qu il trouve un mot précis et une fois celui ci trouvé lui demandé d extraire par exemple les 20 lignes qui suivent?

    au depart j avais pensé a utiliser une boucle avec la commande "getline" 

    mais j ignore comment lui demander si la chaine de caractere de la ligne qu il est en train de lire correspond a ce que je cherche et donc savoir quand est ce qu il doit continuer la boucle ou s arreter et extraire les 20 lignes qui suivent

    • Partager sur Facebook
    • Partager sur Twitter
      2 mai 2024 à 10:19:48

      fredericcantigneau a écrit:

      est il possible de parcourir un fichier jusqu à ce qu il trouve un mot précis et une fois celui ci trouvé lui demandé d extraire par exemple les 20 lignes qui suivent?

      Oui.

      fredericcantigneau a écrit:

      au depart j avais pensé a utiliser une boucle avec la commande "getline" 

      C'est une possibilité. 

      fredericcantigneau a écrit:

      mais j ignore comment lui demander si la chaine de caractere de la ligne qu il est en train de lire correspond a ce que je cherche 

      Ce n'est pas le rôle de getline. La ligne étant extraite dans un std::string, tu peux à ce moment utiliser les méthode de std::string pour faire des recherche dans la chaîne extraite (find).





      • Partager sur Facebook
      • Partager sur Twitter
        2 mai 2024 à 10:27:03

        Il faut quand même réfléchir aux cas particuliers. Définir précisément ce qu'on veut faire si le mot apparaît sur plusieurs lignes.

        Supposons qu'il figure  sur la ligne 11. Normalement il faut afficher les lignes 11 à 30 (ou la fin si on y arrive)

        • Mais si il se trouve aussi sur la ligne 21. Faut-il afficher en prolongeant de 31 à 40, ou seulement jusqu'à  30 ?
        • Et si il se trouve aussi sur la ligne 51 ?

        Si on sait pas ce qu'on veut faire, on aura du mal à y arriver. Faut décider.

        Sinon, les éléments techniques pour le faire, ca va être dans le genre 

        • Une boucle de lecture avec getline
        • Un compteur pour les numéros de ligne
        • Un find pour savoir si le loup y es tu ? 
        • Le numéro de la dernière ligne qu'il faut afficher

        Reste à les combiner de façon à ce que ça fasse ce qu'on a décidé.

        Un algorithme possible (devinette : ça correspond à quoi ?)

        numero ligne = 0
        limite = 0
        
        pour chaque ligne du fichier faire:
           augmenter numéro ligne
           si ligne contient mot:
               limite = numéro ligne + 20
           si numero_ligne < limite:
               afficher la ligne
                 
        

        question :  < ou <= ?



        -
        Edité par michelbillaud 2 mai 2024 à 11:43:49

        • Partager sur Facebook
        • Partager sur Twitter
          2 mai 2024 à 11:44:25

          Ok super, je me doutais que j etais pas loin dans la logique du systeme, mais le meme bloc d infos n etant pas tjrs a la meme place d un fichier a l autre me posait probleme vu mon niveau en c++.

          Je vais donc bien eplucher ce qui concerne les infos que tu m as donnees pour bien gerer ce concept que je vais devoir utiliser tres souvent.

          Je te remercie

          Je dirais <= car numéro ligne 0 +20 =20,

          20 devant etre inclus j arrete la boucle aores 20

          -
          Edité par fredericcantigneau 2 mai 2024 à 11:56:20

          • Partager sur Facebook
          • Partager sur Twitter
            2 mai 2024 à 12:18:39

            (J'imagine que c'est pour un exo. Sinon, sed et awk font déjà ça.)
            • Partager sur Facebook
            • Partager sur Twitter
            C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
              2 mai 2024 à 12:28:24

              l'important, c'est de bien éplucher les concepts pour gérer la logique. Ou l'inverse.

              > Je dirais

              Il s'agit pas de dire, mais de ne pas lancer des trucs en l'air en espérant que ça soit ça.

              Voyons, si on trouve le mot en ligne 1, il faut afficher de 1 à 20.  D'un autre côté 1+20 ça fait 21.

              -
              Edité par michelbillaud 2 mai 2024 à 12:34:23

              • Partager sur Facebook
              • Partager sur Twitter
                2 mai 2024 à 21:21:59

                Ok.

                Je partais du principe que la ligne 0 existait. Donc oui si le mot est en ligne 1 et que ce mot fait partie des 20 lignes il faut aller jusque 20 compris,  et si c est les 20 ligned qui suivent le mot il faut aller jusque 21.

                @lmgs,

                Non c est pas pour un exo.

                Je suis sur un projet perso.

                J ai un ami qui prend en charge le dev du logiciel et j ai decide de prendre en charge la creation des fichiers qui regrouperont les éléments nécessaires a son bon fonctionnement en extrayant des infos de type texte et des datas de type csv.

                Le logiciel etant prevu pour tourner en ligne et les csv depassant parfois les 300Mo ( 279 donnees a 60 Hz pour des sessions allant jusqu a 1h , soit 199000 lignes de datas sur 279 colonnes)

                Il est primordial pour pas exploser mes frais d hébergement que les kpi et infos duverses soient traitees en amont et n envoyer sur le serveur que le stricte nécessaire. 

                Voila tu sais tout xd

                -
                Edité par fredericcantigneau 2 mai 2024 à 21:26:51

                • Partager sur Facebook
                • Partager sur Twitter
                  2 mai 2024 à 22:15:05

                  Du coup, autant partir sur des outils qui existent et qui ne demande pas beaucoup d'effort. Si c'est juste extraire une ligne suivant un pattern + les N qui suivent, ça fait très bien avec grep ou ripgrep. Exemple pour extraire 20 lignes en utilisant ripgrep:

                  rg mon_pattern -A20 monfichier

                  Pour des filtres plus complexes, comme le dit @lmgs, sed et awk fonctionnent bien, mais pour du csv, python + penda sera probablement plus adapté .

                  -
                  Edité par jo_link_noir 2 mai 2024 à 22:16:33

                  • Partager sur Facebook
                  • Partager sur Twitter
                    2 mai 2024 à 22:23:13

                    Il  y a un jeu d'utilitaires "csvtools" qui font le job sur des fichiers CSV ("grep" sur certaines colonnes, etc)

                    https://github.com/Chris00/ocaml-csv

                    -
                    Edité par michelbillaud 2 mai 2024 à 22:41:30

                    • Partager sur Facebook
                    • Partager sur Twitter
                      3 mai 2024 à 21:46:08

                      Merci à tous pour vos retours, je vais checker tout çà, mais d abord me preparer une boite d aspirine xd

                      @jo-link-noir

                      l extraction de datas n est que la 1ere etape du process. De nombreuses equations utilisant ces datas seront a faire avant d etre envoyées sur le serveur. Ce qui representera le plus gros du travail, certaines d entre elles necessaitant plusieurs autres equations en amont pour etre effectuée ce qui rassemblera les données d un dizaine de datas differentes.

                      Bref je vais bien m amuser 

                      -
                      Edité par fredericcantigneau 3 mai 2024 à 22:16:36

                      • Partager sur Facebook
                      • Partager sur Twitter

                      extraire une partie repetitive de différent texte

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      • Editeur
                      • Markdown