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

Langage Perl Discussion :

Problème d'ordre général


Sujet :

Langage Perl

  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2007
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 12
    Points : 7
    Points
    7
    Par défaut Problème d'ordre général
    Bonjour à tous,
    Je suis confronté à un petit problème et je pense que celui-ci pourrait être facilement résolvable par toute personne ayant une connaissance avertie de ce langage,je vous le soumet donc.

    Utilisation:

    J'ai dans un premier temps j'ai ecris un script qui me permet de deduire un statut clinique en fonction de nombreux paramètres extrait d'un fichier texte, ensuiteil a ecriture du résultat dans un fichier texte, cela pour environ 2000 patients. Cette partie du code marche très bien.
    Grossièrement le script correspond a:
    - Tant qu'il y a des lignes (patient) dans le fichier de donnée.
    - Extraction des données necessaires
    - Integration de ces données dans un modèle de prediction.
    - Obtention d'un statut résultat
    - Ecriture du num_patient + statut dans le fichier texte de sortie.

    J'obtient bien un fichier de sortie avec l'ensemble des patients et leurs statut respectif, mais....

    Ayant il y a peu decouvert le module use PDF::......; je me suis mis au defi de generer un fichier pdf avec un tableau contenant l'ensemble des résultats or le probleme reside du fait que ne je ne sais que generer des tableaux une fois que j'ai l'ensemble des valeurs qu'il devra contenir.

    Construction une fois que l'on a toute les valeurs du tableau:

    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
    #!/usr/bin/perl
     
    # Ce code marche
     
    use strict;
    use PDF::API2;
    use PDF::Table;
     
     my $pdftable = new PDF::Table;
     my $pdf = new PDF::API2(-file => "Breast_Cancer.pdf");
     my $page = $pdf->page();
     $pdf->megaboss('A4');
     
    # pas necessaire de faire ce tableau mais ça m'entraine...
     my @tableau_pdf_entete = ('       
            Numéro        
          du patient',
    	'         Methode      ',
    	'        Code     ',
    	'        probabilité    ');
     
    my @tableau_pdf_valeurs  = ($numero_patient,
    					$code,
    					$nom_methode,
    					$probabilite);
     
    my $tableau_pdf =[
            [$tableau_pdf_entete[0],  # Entete
             $tableau_pdf_entete[1],
             $tableau_pdf_entete[2],
             $tableau_pdf_entete[3]
    		 ],
     
    	[$tableau_pdf_valeurs[0], # Ligne du tableau/Une ligne parpatient
             $tableau_pdf_valeurs[1],
             $tableau_pdf_valeurs[2],
             $tableau_pdf_valeurs[3]
             ],
     
    	#..... 2000 fois avec le résultat respectif de chaque patient
     
    ######################
    #   + ARCHITECTURE  TABLEAU #
    ######################

    Ce que je pensé...en depit...s'était de faire de la cuisine avec ;

    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     use PDF::API2;
     use PDF::Table;#use Table;
     
     my $pdftable = new PDF::Table;
     my $pdf = new PDF::API2(-file => "Mon_fichier3.pdf");
     
     
    print "Entrez nom fichier\n";
    my $nom_fichier = <STDIN>;
    chop($nom_fichier);# annulation du retour chariot
    my $nom_fichier2 =$nom_fichier.".txt";# On ajoute l'extension .txt au nom du fichier afin de rendre possible son ouverture
     
    open(F, $nom_fichier2) or die "Le fichier n'existe pas !";# On ouvre le fichier comportant les données
     
    my $page = $pdf->page();
     $pdf->mediabox('A4');
     
    	my @tableau_pdf_entete = ('Numéro du patient',# Entete
    					       'Methode',
    					       'Code',
    					       'probabilité');
     
     
    	my @tableau_pdf_valeurs  = ('$numero_patient',
    						'$resultat_pdf',
    						'$method_pdf',
    						'$probabilite');
    	my $tableau_pdf =[
    				        [$tableau_pdf_entete[0],  # Entete
    				         $tableau_pdf_entete[1],
    				         $tableau_pdf_entete[2],
    				         $tableau_pdf_entete[3]
    				         ],
     
     
    while ($Patient = <F>) #boucle tant qu'il ya des patients a etudier (ligne dans le fichier).
    {
       # Ici ma boucle qui genere les valeurs de:  $numero_patient
       #							    $resultat_pdf
       #							    $method_pdf
       #							    $probabilite
       #      
     
     
    						[$numero_patient, # Ligne du tableau
    					         $resultat_pdf,
    						 $method_pdf,
    					         $probabilite
    					        ],
     
    					];
     
    #####################
    #+ ARCHITECTURE  TABLEAU  #
    #####################
     
    }	
     
    $pdf->saveas();
     
     
     
    close FICHIER;# fermeture des fichiers

    Merci d'avoir de l'indulgence face à cet affreux script mais il faut bien un debut a tout, même à la progammation... Bonne jounée

  2. #2
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Alors primo, une manière plus simple d'écrire ton premier script :
    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
    #!/usr/bin/perl
     
    # Ce code marche
     
    use strict;
    use PDF::API2;
    use PDF::Table;
     
     my $pdftable = new PDF::Table;
     my $pdf = new PDF::API2(-file => "Breast_Cancer.pdf");
     my $page = $pdf->page();
     $pdf->mediabox('A4');
     
    # pas necessaire de faire ce tableau mais ça m'entraine...
     my @tableau_pdf_entete = ('       
            Numéro        
          du patient',
    	'         Methode      ',
    	'        Code     ',
    	'        probabilité    ');
     
    my @tableau_pdf_valeurs  = ($numero_patient,
    					$code,
    					$nom_methode,
    					$probabilite);
     
    my $tableau_pdf =[
      [@tableau_pdf_entete],
      [@tableau_pdf_valeurs],
      # etc...
    ]
    Deuxio, regarde de plus près la fonction push() (ainsi que pop(), shift() et unshift() pour la complète, splice() est également intéressante mais beaucoup plus puissante et potentiellement complexe).

    Pour ton second code, quelque chose comme ça serait sans doute bon :
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    #!/usr/bin/perl
    use strict; use warnings;
     
    use PDF::API2;
    use PDF::Table;#use Table;
     
    my $pdftable = new PDF::Table;
    my $pdf = new PDF::API2(-file => "Mon_fichier3.pdf");
     
     
    print "Entrez nom fichier\n";
    my $nom_fichier = <STDIN>;
    # chomp est mieux que chop !!
    chomp($nom_fichier);
    $nom_fichier .= ".txt";
     
    open my($donnees), '<', $nom_fichier 
      or die "Impossible d'ouvrir le fichier $nom_fichier : $!\n";
     
    my $page = $pdf->page();
    $pdf->megabox('A4');
     
    my @tableau_pdf_entete = (
      'Numéro du patient',
      'Methode',
      'Code',
      'Probabilité'
    );
    my @tableau_pdf = ( [@tableau_pdf_entete], );
     
    while ( my $patient = <$donnees>) {
      # Ici ma boucle qui genere les valeurs de:  $numero_patient
      #							    $resultat_pdf
      #							    $method_pdf
      #							    $probabilite
      #      
     
      push @tableau_pdf, [
        $numero_patient,
        $resultat_pdf,
        $method_pdf,
        $probabilite
      ];
     
    }
     
    close $donnees;
     
    $pdftable->table(
      $pdf,
      $page,
      \@tableau_pdf,
      #paramètres de mise en forme
    );
     
    $pdf->saveas();
     
    __END__
    --
    Jedaï

  3. #3
    Futur Membre du Club
    Inscrit en
    Avril 2007
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 12
    Points : 7
    Points
    7
    Par défaut Remerciement
    Re-,
    Le script corrigé marche parfaitement, je te remercie donc d'une part pour avoir pris le temps de me répondre et pour avoir résolu mon problème. Il me reste juste a le bosser un peu afin de pouvoir réappliquer la méthode.Ceci dit deux petites questions me viennent à l'esprit.

    - Pourquoi dis-tu (avec des !!) que "chomp" est mieux que "chop" dans ce cas là...car quoi qu'il arrive je ne dois retirer que le retour chariot...<STDIN> ne peut prendre effet qu'après la pression de la touche Enter,je me trompe?

    - Dans la correction du script je pense que tu utilises le réferançage, car je ne connaîs pas cette façon de faire et il me semble avoir lu un papier sur ce thème. Je te remercie de m'avoir fait appercevoir ses travers en l'appliquant à ce script. Je vais approfondir la question en essayant de trouver un tutorial approprié...je voudrais juste savoir si tu connas un tutorial sur la question, que tu conseillerais aux novices, ça m'eviterais de perdre du temps.

    Merci encore, tu as fait un heureux, bonne fin de journée.

  4. #4
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par Ash2oπΩ
    - Pourquoi dis-tu (avec des !!) que "chomp" est mieux que "chop" dans ce cas là...car quoi qu'il arrive je ne dois retirer que le retour chariot...<STDIN> ne peut prendre effet qu'après la pression de la touche Enter,je me trompe?
    Je ne pense pas que tu te trompes, encore que des conditions inattendues (interruptions, pipe) puissent me faire mentir... En tout cas je n'utilise jamais chop() là où je veux dire chomp(), simplement parce qu'il n'y a aucune raison de prendre le risque de tronquer sa chaîne inutilement. Prends ça comme un simple conseil de prudence : sauf si tu veux explicitement supprimer le dernier caractère de la chaîne quel qu'il soit, utilise chomp() plutôt que chop() dans l'objectif de supprimer un retour charriot en fin de chaîne.

    Citation Envoyé par Ash2oπΩ
    - Dans la correction du script je pense que tu utilises le réferançage, car je ne connaîs pas cette façon de faire et il me semble avoir lu un papier sur ce thème. Je te remercie de m'avoir fait appercevoir ses travers en l'appliquant à ce script. Je vais approfondir la question en essayant de trouver un tutorial approprié...je voudrais juste savoir si tu connais un tutorial sur la question, que tu conseillerais aux novices, ça m'eviterais de perdre du temps.
    Tu peux toujours consulter perlreftut, ainsi que perlref si tu veux plus de détails. Sinon notre FAQ contient une brève explication sur les références également.

    --
    Jedaï

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

Discussions similaires

  1. [batch] Problème d'ordre général
    Par *SunBoTi* dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 29/08/2008, 09h46
  2. Questions d'ordre général et sur un problème
    Par jocelyn54 dans le forum C
    Réponses: 5
    Dernier message: 04/12/2007, 20h16
  3. Problème d'ordre de remplissage de table
    Par matana dans le forum Langage SQL
    Réponses: 6
    Dernier message: 24/03/2006, 16h37
  4. Réponses: 3
    Dernier message: 18/08/2005, 11h57
  5. [XSLT]Problèmes d'ordre de lecture et d'écriture
    Par leup dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 11/07/2005, 10h36

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