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 :

Compléter une liste.


Sujet :

Langage Perl

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 6
    Points : 4
    Points
    4
    Par défaut Compléter une liste.
    Bonjour
    J'ai des données de 10 en 10 minutes qui une fois mise en forme donnent:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    010620100810;0.0;18.1;14.3;92;...
    010620100820;0.0;18.3;13.6;90;...
    010620100830;0.0;18.6;13.5;97;...
    010620100850;0.0;18.7;12.9;101;...
    010620100900;0.0;18.8;13.2;99;...
    Le problème c'est que quelquefois il manque une ou plusieurs données et je voudrais donc compléter la liste en les remplaçant par une ligne de caractères prédéfinis tel que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    010620100810;0.0;18.1;14.3;92;...
    010620100820;0.0;18.3;13.6;90;...
    010620100830;0.0;18.6;13.5;97;...
    010620100840;////;////;////;////;...
    010620100850;0.0;18.7;12.9;101;...
    010620100900;0.0;18.8;13.2;99;...
    Quelqu'un aurait-il une idée simple ?
    Merci d'avance

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Ceci semble faire l'affaire :

    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
    use POSIX qw(mktime strftime);
     
    my @default_line = ("////", "////", "////");
     
    sub next_mn {
      my ($current_mn) = @_;
     
      my ($day, $month, $year, $hour, $min) = $current_mn =~ /(\d\d)(\d\d)(\d\d\d\d)(\d\d)(\d\d)/;
     
      return strftime("%d%m%Y%H%M",
                      0, $min + 10, $hour, $day, $month - 1, $year - 1900);
    }
     
    my $expected_mn;
    while (<DATA>) {
      my ($mn) = split /;/;
      while (defined $expected_mn && $expected_mn != $mn) {
        print join ";", $expected_mn, @default_line, "\n";
        $expected_mn = next_mn($expected_mn);
      }
      print;
      $expected_mn = next_mn($mn);
    }
     
    __DATA__
    010620100810;0.0;18.1;14.3;92;...
    010620100820;0.0;18.3;13.6;90;...
    010620100830;0.0;18.6;13.5;97;...
    010620100850;0.0;18.7;12.9;101;...
    010620100900;0.0;18.8;13.2;99;...
    Il se base essentiellement sur strftime (fonction POSIX).

    Si tu as besoin d'explication(s), n'hésite pas.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Salut
    J'ai essayé, j'ai saisi la démarche mais je ne comprend pas tout.

    sur la ligne
    return strftime("%d%m%Y%H%M", 0, $min + 10, $hour, $day, $month - 1, $year - 1900);

    il me trouve des variables non définies $min $hour $day $month et $year
    je crois que ça viens de la ligne avant

    my ($day, $month, $year, $hour, $min) = $current_mn =~ /(\d\d)(\d\d)(\d\d\d\d)(\d\d)(\d\d)/;
    et il ne me sort rien

  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Etrange, le script fonctionne chez moi. Qu'as-tu changé dedans ? Pourrais-tu le reposter ?
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Voila 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
    #!/usr/bin/perl
    use warnings;
    use strict;
    use POSIX qw(mktime strftime);
     
     
    my $nom_fichier = "/jeff/resultat.dat";
    my $day;
    my $month;
    my $year;
    my $min;
    my $ligne;
     
     
    my @default_line = ("////", "////", "////");
    open(FIC,"$nom_fichier") or die "Ce fichier $nom_fichier n'a pu être ouvert : $!\n";;
    my @fic = <FIC> ;
     
    foreach  $ligne (@fic) {
    &next_mn()
    }
    sub next_mn {
    my $current_mn = @_;
      my ($day, $month, $year, $hour, $min) = $current_mn =~ /(\d\d)(\d\d)(\d\d\d\d)(\d\d)(\d\d)/;
      return strftime("%d%m%Y%H%M", 0, $min + 10, $hour, $day, $month - 1, $year - 1900);
     
    my $expected_mn;
    while (<FIC>) {
      my ($mn) = split /;/;
      while (defined $expected_mn && $expected_mn != $mn) {
        print join ";", $expected_mn, @default_line, "\n";
        $expected_mn = next_mn($expected_mn);
      }
      print;
      $expected_mn = next_mn($mn);
    }
    }
     
    close(FIC);
    Excuse moi, dérapage de clavier...

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Je comprends mieux... à présent, il faudrait avoir le fichier de test, sans cela, difficile de trouver l'erreur
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Salut
    extrait du fichier à traiter avec une "anomalie"

    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
     
    010620100810;0.0;18.1;14.3;92; 
    010620100820;0.0;18.3;13.6;90;
    010620100830;0.0;18.5;13.8;90;
    010620100840;0.0;18.6;13.5;97;
    010620100850;0.0;18.7;12.9;101;
    010620100900;0.0;18.8;13.2;99;99;
    010620100910;0.0;18.9;13.6;96;99;
    010620100920;0.0;18.8;17.2;90;99;
    010620100950;0.0;18.8;13.6;91;99;
    010620101000;0.0;19.2;13.6;100;99;
    010620101010;0.0;19.2;14.2;90;99;
    010620101020;0.0;19.1;12.9;97;99;
    010620101030;0.0;19.0;16.4;86;99;
    010620101040;3.5;19.1;11.7;104;99;
    010620101050;27.5;19.3;10.9;105;99;
    010620101100;0.0;19.4;11.7;116;99;
    010620101110;0.0;19.4;13.6;103;99;
    010620101120;0.0;19.6;11.5;105;99;
    010620101140;0.0;19.3;12.0;100;99;
    010620101150;0.0;19.0;12.3;105;99;
    010620101200;0.0;18.9;13.1;103;99;
    A+

  8. #8
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    En fait, ton script contient plusieurs erreurs, et la première est que tu tentes de lire deux fois ton fichier sans le fermer entre temps. La première fois ici :
    et la deuxième ici :
    Comme lors de la première lecture, tu ne fais rien d'utile (boucle de l'appel à next_mn qui n'est pas utilisé), il ne se passera rien lors de la 2e boucle.

    Par ailleurs, tu n'utilises pas la fonction next_mn correctement, puisque celle-ci attend en paramètre un scalaire contenant une date/heure. Il est donc normal que le script plante en indiquant que des valeurs ne sont pas définies (et pas que des variables ne sont pas déclarées, ce qui est bien différent).

    Ensuite, tu as modifié l'imbrication des blocs, et du a englobé la boucle principale while (<FIC>) dans la fonction next_mn. Il faut donc fermer le bloc de la fonction next_mn après le return.

    Tu as également modifié l'affectation du paramètre de la fonction next_mn. J'avais écris :
    que tu as ré-écris
    Estimant sans doute que les parenthèses étaient inutiles. Or, en perl, la plupart des opérateurs a une comportement différent selon qu'ils sont utilisés dans un contexte de liste (c'est à dire lorsqu'une liste de plusieurs scalaires est utilisée comme opérande(s)). Ainsi, l'opérateur d'affectation reçoit son contexte de l'opérande de gauche (la variable affectée). S'il est scalaire, il castera l'opérande de droit au type scalaire (affecter une array à un scalaire affectera alors la taille de l'arrêt dans ce scalaire). Si au contraire il s'agit d'un contexte de liste (caractérisé, dans notre cas, pas la liste d'un élément fournie à gauche : my ($mcurrent_mn) ), alors il affectera les éléments de la liste de l'opérande de droite dans l'opérande de gauche.
    Pour récupérer le premier argument d'une fonction, on peut aussi écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $current_mn = shift  @_;
    et dans ce cas, shift retournant toujours un scalaire, les parenthèse dans l'opérande de gauche ne sont pas nécessaires. Mais horsmis récupérer l'objet courant en programmation OO, je n'utilise jamais cette forme qui a une effet de bord sur @_ (supprime l'élément de la liste).

    Pour finir, il est totalement inutile (voire déconseillé pour éviter tout effet de bord non désiré) de définir $day, $month, $year, $hour et $min alors même qu'ils sont déjà définis dans la fonction next_mn (et qu'ils ne sont pas utiles ailleurs).

    Ton problème tient donc essentiellement à la définition et à l'usage de la fonction next_mn. Si tu avais gardé mon script original, et simplement modifié l'ouverture du fichier, cela aurait fonctionné :

    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
    #!/usr/bin/perl
    use warnings;
    use strict;
    use POSIX qw(mktime strftime);
     
    my $nom_fichier = "resultat.dat";
    my $ligne;
     
    my @default_line = ("////", "////", "////");
    open(FIC,"$nom_fichier") or die "Ce fichier $nom_fichier n'a pu être ouvert : $!\n";;
     
    sub next_mn {
    my ($current_mn) = @_;
      my ($day, $month, $year, $hour, $min) = $current_mn =~ /(\d\d)(\d\d)(\d\d\d\d)(\d\d)(\d\d)/;
      return strftime("%d%m%Y%H%M", 0, $min + 10, $hour, $day, $month - 1, $year - 1900);
    }
     
    my $expected_mn;
    while (<FIC>) {
      my ($mn) = split /;/;
      while (defined $expected_mn && $expected_mn != $mn) {
        print join ";", $expected_mn, @default_line, "\n";
        $expected_mn = next_mn($expected_mn);
      }
      print;
      $expected_mn = next_mn($mn);
    }
     
    close(FIC);
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

Discussions similaires

  1. Comment compléter une liste de jours
    Par clavier12AZQSWX dans le forum Langage SQL
    Réponses: 3
    Dernier message: 02/10/2013, 09h58
  2. compléter une liste avec données manquantes
    Par Endive dans le forum Général Python
    Réponses: 2
    Dernier message: 25/05/2010, 20h39
  3. Compléter une liste déroulante
    Par Alain7751 dans le forum IHM
    Réponses: 2
    Dernier message: 25/03/2009, 08h11
  4. Réponses: 4
    Dernier message: 12/02/2008, 09h54
  5. Réponses: 0
    Dernier message: 06/11/2007, 10h47

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