Forum Programmation.perl écrire les résultats dans le même fichier

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
-2
19
août
2015

salut a tous j'ai 2 code qui fonctionne bien que j'aimerai ecrire en un script pour que les resultats soient ecrit sur meme fichier de sortie, je pense que le probleme ce situe sur l'emploi de la peseudo-varible $_ dans l'un des codes et ma variable d'incrementation $i dans l'autre. car chacun des codes me revois plusieurs Fichiers de sortie quand il sont execute et si a jamais on les uni j'attendrai de nouveau plusieurs fichiers de sortie. Merci bien de vos propositions, en voila les 2 codes pour que chacun puisse avoir un appercu claire

code 1:

  • # FIFO ?

    Posté par  . Évalué à 2.

    Salut,

    je ne connais pas PERL, mais si tes scripts fonctionne en même temps, le plus simple me semble de créer un pipe nommé. Tes deux scripts écrivent dedans et tu ajoutes un troisième scripts qui le lit et écrit la sortie dans un fichier.

    Ex :
    writer.sh

    #!/bin/bash
    
    while true
    do
       echo $1 >>test.fifo
       sleep $2
    done

    Dans le shell :

    $ mkfifo test.fifo
    $ chmod +x writer.sh

    Dans différent terminaux :

    $ ./writer.sh toto 1 # tutu 2 dans un autre terminal…

    Pour lire :

    $ tail -f test.fifo
    • [^] # Re: FIFO ?

      Posté par  . Évalué à -5.

      Je suis totalement egare dans ta proposition, pource stage je travaille qu'avec Perl

  • # Peut-être…

    Posté par  . Évalué à 2.

    Je ne suis vraiment pas sûr d'avoir compris le problème. On dirait que le deuxième script écrit une table, et le premier une en-tête et une table. Donc le deuxième devrait écrire après le premier, je suppose. Peut-être que dans le deuxième script :

    open $outputFHs[$_], ">>", "$header[$_].html";

    avec >> à la place de >, est ce que tu veux, pour ajouter au lieu d'effacer le fichier.

    • [^] # Re: Peut-être…

      Posté par  . Évalué à -5.

      Salut Anaseto,
      auf fait les deux code produisent des Tableaux, j'aimerai que ses deux tableaux soient ecrit sur le meme fichier afin que l'aon puisse facilement distingue la difference entre les tableaux, car en le faisant sur 2 pages comme je voulais et ce qui aurait ete facile mon maitre de stage trouvais cela pas du tout interessant et c'est la raison pour laquel je demande de l'aide ici.

      il faut que je mensionne une fois de plus que le premiers code me revois plusieurs fichiers chacun portant un nom et que le second me revois aussi plusieurs fichiers chacun portant son nom, il faut aussi savoir que un fichier revoye par le code 1 peu porte le meme nom qu'un fichier renvoye par le code 2. car le code un revois tous le parametres se trouvant dans le systeme et le code 2 revoit tout les parametre ce trouvant dans le systeme comportant une erreur.

      en ce qui concerne ta Proposition je l'ai deja essayer malheureusement elle n#a pas marche

      • [^] # Re: Peut-être…

        Posté par  . Évalué à 2.

        Je n'arrive toujours pas trop à comprendre, désolé. J'ai bien compris que ton premier script produit des fichiers, ton deuxième d'autres, que potentiellement le nom des fichiers peuvent entrer en collision, mais je n'ai pas compris quel est le comportement voulu dans ces cas, ni si c'est là le problème. Si tu utilises >> dans ton deuxième script, tu ajoutes au résultat du précédent, donc sur la même page tu as les deux tableaux (dans le cas où le nom d'un fichier est le même), mais visiblement ce n'est pas ça le problème.

        Bref, je pense que tu devrais essayer de rédiger ton problème dans tous les détails et dans un ordre pédagogique, peut-être que tu arriverais même à le résoudre tout seul (et plus vite), c'est souvent ce qui arrive lorsqu'on s'essaye à cet exercice.

        Un détail qui n'a pas à voir avec ton problème principal : tu oublies de fermer certaines balises html (html et body).

      • [^] # Re: Peut-être…

        Posté par  . Évalué à 2.

        ce que tu veux c'est ouvrir le meme fichier (qui existe deja) avec l'option "append" pour ajouter des lignes dedans…

        • [^] # Re: Peut-être…

          Posté par  . Évalué à -5.

          Neox, je peus dire que c'est quelque chose de ce genre, mais comme les Fichiers sont telement nombreux comment le "append" s'applique dans un tel cas.

          par ailleur c'etait aussi l'une des raison pour laquel je voulais savoir comment "print" dans un dossierbien determine.

          • [^] # Re: Peut-être…

            Posté par  . Évalué à 2.

            le append s'apple lors de l'appel à open.

            donc si tu as un fichier SOURCEA.csv, SOURCEB.csv
            que tu fais la boucle pour faire SOURCEA.html puis SOURCEB.html

            dans ta 2e boucle, tu ouvres la destination avec l'option append,
            et ca va ajouter les resultats dans SOURCEA.html au lieu d'ecraser le fichier.

            pour enregistrer dans un dossier particulier, retourne lire les propositions faite sur le precedent post, il y a les solutions et des exemples qui fonctionnent (sous linux certes, mais ca fonctionne)

            • [^] # Re: Peut-être…

              Posté par  . Évalué à -5.

              bonjour Neox,
              je l'ai deja souligne si je ne me trompe pas car ce chemin donc tu expplique je l'ai deja fait et comme je l'ai dit il reecrit a plusieurs fois son resultat dans le meme fichier comme je peus empeche qu'il le face. j'essaye de m'expliquer le le code A revois pplusieurs fichiers SOURCEA.html maintenant le code B quand il ecrit son resultat dans les SOURCEA.html il le recrit plusieurs fois.
              pour etre plus claire voici un exemple
              sortie code A:
              DPA01
              a
              b
              c
              d
              e
              f
              deuxieme fichier de code A
              DPA02
              q
              w
              e
              r
              t
              z
              maitenant code B quand il veut ecrit son resultat dans ses fichiers il fait ceci
              DPA01
              a
              b
              c
              d
              e
              f
              DPA01
              z
              u
              i
              o
              DPA01
              z
              u
              i
              o
              DPA01
              z
              u
              i
              o
              deuxieme fichier de code B
              DPA02
              q
              w
              e
              r
              t
              z
              DPA02
              c
              v
              b
              n
              DPA02
              c
              v
              b
              n
              DPA02
              c
              v
              b
              n

              c'est cela le probleme comment faire a qu'il ecrive que une seul fois et arrete tout en traitant tout le fichier donc il est sence traite car le code A traite un fichier DATA.csv et le code B lui traite un fichier DATA2.csv.

              • [^] # Re: Peut-être…

                Posté par  . Évalué à 2.

                ton truc ressemble à des problemes de boucles qui ne sont pas imbriquées.

                du coup ton code fait :

                ta boucle 1 remplis $file avec
                DPA01
                puis DPA02
                ta boucle 1 se termine, $file vaut DPA02

                ta boucle 2 demarre, remplie $i avec des valeurs,
                et utilise $file qui vaut toujours DPA02
                ta boucle 2 se termine

                alors que finalement tu voudrais un truc du style :

                demarre boucle 1,
                active DPA01
                  demarre boucle2
                  traite les elements $i pour DPA01
                  termine boucle2
                active DPA02
                  demarre boucle2
                  traite les elements $i pour DPA02
                   termine boucle2
                termine boucle1

                ce qui s'ecrit en code comme (syntaxe surement fausse, mais ca donne le visuel) :

                for $file in DPA01 DPA02
                {
                   for $i in DATA1 DATA2
                   {
                        action sur $i avec $file
                    }
                }
                • [^] # Re: Peut-être…

                  Posté par  . Évalué à -5.

                  a ce niveau je ne te comrprend pas du tout pour tes boucles en temps normal le code B traite un DATA2.csv et ecrit dans des fichiers, car dasn le DATA2.csv les noms parexmple
                  DPA01 DPA02 DPA03 revient plusieurs fois en avec les memes donnes il les reecrit dans le meme fichier
                  et au finisch on a comme l'inpression qu'il ne l'a fait qu'une fois, maintenant j'aimerai qu'il ecrive juste une fois car les noms reviennent a chaque fois avec les memes donnes donc l'ecrire juste une fois et ignorer tout ce suivra, et passe au nom suivant soit DPA02 faire la meme chose ecrire les donnes une fois et ignore tous ceux qui suivrent

                  • [^] # Re: Peut-être…

                    Posté par  . Évalué à 2.

                    ah ben pour ca faut peut-etre deja decrire en francais (ou dans ta langue natale) ce que tu veux que ton nouveau programme fasse.

                    on appelle ca l'alogoritme de ton programme, de memoire on avait d'abord un programme simple,
                    qui lisait des DATA à partir d'un seul fichier, dans un tableau, et sortait du HTML

                    OUVRE DATA.csv
                    POUR chaque $LIGNE que je lis dans DATA.csv
                        SI je trouve un $MOTIF dans la $LIGNE
                            ALORS je fais une 
                                ou plusieurs action
                            SINON je fais une
                                ou plusieurs autres actions
                       FIN_DU-si_je_trouve_un_motif
                    FIN_DU-pour_chaque_ligne_que_je_lis
                    FERME DATA.csv

                    nous avions ensuite rajouter la possibilité de prendre un ensemble de fichier de données pour sortir plusieurs tableaux

                    POUR chaque $FICHIER pris dans la liste des fichiers CSV du dossier
                       OUVRE $FICHIER.csv
                       POUR chaque $LIGNE que je lis dans DATA.csv
                            SI je trouve un $MOTIF dans la $LIGNE
                                ALORS je fais une 
                                    ou plusieurs action
                                SINON je fais une
                                    ou plusieurs autres actions
                           FIN_DU-si_je_trouve_un_motif
                        FIN_DU-pour_chaque_ligne_que_je_lis
                        FERME $FICHIER.csv
                    FIN_DU-pour_chaque_fichier_pris_dans_la_liste

                    à toi de jouer pour faire ton nouvel algoritme qui va traiter les données, dans l'ordre que tu veux, avec les actions que tu veux.

                    ensuite comme tu sais maintenant ecrire une boucle en perl, des tests, et des sorties,
                    à toi de faire la "traduction" de ton alogritme en code perl.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.