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 :

lecture nouvelles entrées d'un fichier


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Info
    Inscrit en
    Novembre 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Info

    Informations forums :
    Inscription : Novembre 2009
    Messages : 60
    Par défaut lecture nouvelles entrées d'un fichier
    Salut !

    Pour vous faire le topo :

    J'ai un capteur qui me crache dans un fichier (qui change tous les jours) des données, une ligne par donnée dont le format est connu "date;val1;val2;val3"
    Ces données je dois les écrire (quasiment) en temps réèl dans une base de donnée. A titre d'info, j'ai un capteur1 qui ecrit dans un fichier toute les secondes et un autre capteur2 toutes les 3 minutes dans un autre fichier.

    Je pensais faire ça avec PERL.
    Pour pas faire d'ouverture/fermeture intampestive de la connexion à la base je pensais ouvrir/fermer la connexion à chaque changement de fichier à savoir tous les jours.

    Seulement je me retrouve chaque jour avec un fichier qui est rempli (chaque seconde ou chaque 3 minutes en fonction du capteur considéré) en continu, et moi je ne voudrais lire à chaque fois que les nouvelles entrées ... un peu comme un tail -F sous Linux, pour n'écrire que les nouvelles entrées dans ma base de données !

    Et là je pêche parce que je sais pas faire et que je trouve rien là-dessus ...

    Des infos ? ou suggestions ?
    Et aussi pensez vous que PERL soit le mieux adapté pour cette tâche ?

    Merci !

  2. #2
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Perl est en effet bien adapté pour . Par contre, pour la lecture de tes fichiers, tu ne devrais plus faire de lecture ligne à ligne, mais par taille d'octets en utilisant sysread. Ainsi, tu pourrais commencer la lecture là où tu veux.

  3. #3
    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 : 59
    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
    Par défaut
    Autre solution, tu conserves pour chaque fichier le nombre de ligne déjà lue (cas d'un script démon : tu les conserves en mémoire ; cas d'un script lancé ponctuellement : tu le conserves dans un fichier d'initialisation) et tu lis l'entête sans l'analyser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    open my $F1, "<", "file1.txt" or die "Can't open file $F1: $!\n";
    <$F1> foreach 1 .. $old_lines_count1;
    while (my $new_line = $F1) {
      ...
    }

  4. #4
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Bonne idée également. Dans tous les cas, tu devras avoir un étape intermédiaire de stockage d'information.

  5. #5
    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 : 59
    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
    Par défaut
    Il existe aussi des solutions, un peu plus ardues, utilisant les pipes et select : dans ce cas, ton script perl pourra lancer les processus d'acquisition lui même, mais pour cela, il faut que ces processus acceptent de retourner leur résultat sur la sortie standard (par une option par exemple).

    Cela dit, c'est une solution qui peut s'avérer problématique (notamment si les processus des capteurs ne flushent pas les données émises).

  6. #6
    Membre confirmé
    Profil pro
    Info
    Inscrit en
    Novembre 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Info

    Informations forums :
    Inscription : Novembre 2009
    Messages : 60
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    Autre solution, tu conserves pour chaque fichier le nombre de ligne déjà lue (cas d'un script démon : tu les conserves en mémoire ; cas d'un script lancé ponctuellement : tu le conserves dans un fichier d'initialisation) et tu lis l'entête sans l'analyser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    open my $F1, "<", "file1.txt" or die "Can't open file $F1: $!\n";
    <$F1> foreach 1 .. $old_lines_count1;
    while (my $new_line = $F1) {
      ...
    }
    Tout aussi interressant que la précedent mais semble t'il plus facile à mettre en oeuvre pour un presque novice comme moi ...

    Pour ma compréhension,
    - tu ouvre le fichier files.txt que tu balance dans la variable $F1
    - LOL et après j'ai du mal à saisir ....
    - <$F1> foreach 1 .. $old_lines_count1; je suis pas sur de comprendre ce que ça fait ... lecture ligne par ligne ? et ?
    - while (my $new_line = $F1) et ça non plus ...

    pourtant je suis pas novice en programmation mais là je suis un peu perdu .... pourtant l'idée de départ me semblait bien claire mais ta façon de l'écrire m'échappe un peu et je suis très interessé d'avoir quelques petites explication pour pallier à mon ignorance ...

    Merci,
    Aurélien.

  7. #7
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Le concept de philou est le suivant. Ton programme est censé remplir ta base de données et lire le fichier qui se rempli au fur et à mesure. Pour ce faire il va faire ceci :
    - A la première lecture, le fichier fait 10 lignes par exemple. Donc il lit 10 lignes. et stocke le numéro 10 dans un fichier init_line.txt
    - A la deuxième lecture, 15 minutes après par exemple, il lit init_line.txt, récupère 10. puis relis le fichier. Sauf qu'il va parcourir les 10 premières lignes sans rien faire, D'où le code de philou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <$F1> foreach 1 .. $old_lines_count1;
    avec $old_lines_count1 égal au 10 récupéré dans le fichier init_line.txt. Puis à partir de la ligne 11 il fait son traitement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while (my $new_line = <$F1>) {
     # ...
    }
    Puis il stocke le numéro de la dernière ligne lue dans le fichier init_line.txt en écrasant le fichier. Et ainsi de suite.

    Est ce clair ?

  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 : 59
    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
    Par défaut
    Citation Envoyé par nodules Voir le message
    Pour ma compréhension,
    - tu ouvre le fichier files.txt que tu balance dans la variable $F1
    Je ne balance pas le fichier dans $F1, mais son FileHandle
    - <$F1> foreach 1 .. $old_lines_count1; je suis pas sur de comprendre ce que ça fait ... lecture ligne par ligne ? et ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <$F1> foreach 1 .. $old_lines_count1;
    <$F1> signifie : lire dans $F1 une ligne. Comme je ne fait rien de cette ligne, je ne l'affecte à aucune variable.
    foreach 1 .. $old_lines_count1 est une forme syntaxique "modificative" (voir perldoc perlsyn "Statement Modifiers"). Dans le cas de foreach, elle permet d'itérer la commande précédent foreach pour autant d'élément que dans la liste suivant foreach, à savoir ici 1 .. $old_lines_count1
    Quand à 1 .. $old_lines_count1, c'est l'opérateur d'étendue .. appliqué aux opérandes 1 et $old_lines_count (c'est à dire la liste des entiers compris entre 1 et $old_lines_count1). Voir perldoc perlop.
    - while (my $new_line = $F1) et ça non plus ...
    J'ai fait une erreur en écrivant ce code, il fallait y lire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (my $new_line = <$F1>) {
    Avec les éléments précédent, tu devrais comprendre ce qu'elle signifie.

  9. #9
    Membre confirmé
    Profil pro
    Info
    Inscrit en
    Novembre 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Info

    Informations forums :
    Inscription : Novembre 2009
    Messages : 60
    Par défaut
    Merci les gars ... très très clair maintenant.

    En fait, c'était pas tant la structure que je comprenanit pas mais plutôt la syntaxe à laquelle en fait je me rend compte que je ne suis pas du tout habitué.

    Même si j'avais compris le rôle du foreach, l'opérateur .. m'avais un peu perturbé dans la mesure où je ne le connaissais pas. Bref ...

    Et puis j'avais pas capté le fichier intermédiaire et d'où sortait $old_lines_count1


    Un grand merci, je vais mettre ça en oeuvre en espérant ne plus vous embêter ce qui sera bon signe !

Discussions similaires

  1. [XLS] De deux listes déplacer les nouvelles entrées
    Par Henrique92 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 20/09/2005, 22h12
  2. Réponses: 5
    Dernier message: 03/06/2005, 14h06
  3. Problème lecture de nombre dans un fichier en c++
    Par knecmotet dans le forum C++
    Réponses: 1
    Dernier message: 28/10/2004, 15h48
  4. Réponses: 2
    Dernier message: 03/02/2004, 21h56
  5. Réponses: 2
    Dernier message: 26/09/2003, 14h51

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