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

Web Perl Discussion :

Scanner un répertoire et traiter les données


Sujet :

Web Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 17
    Par défaut Scanner un répertoire et traiter les données
    Bonjour,

    J'ai créé une ligne de commande à base de find qui scanne des répertoires de mon disque, et extrait des données des fichiers xml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    find /rep_journaux/ -maxdepth 2 -name *xml -exec perl -ne '@t=/<nom_journal>(.*?)<\/nom_journal><date>(.*?)<\/date>/g; print "@t\n"' {} \;
    ça marche très bien mais je voudrais avoir aussi le nom du fichier xml qui a été reconnu afin de le supprimer... et tout ça dans un script perl...



    Une idée ?

    Merci.

  2. #2
    Expert confirmé
    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
    Par défaut
    Citation Envoyé par Flyer007 Voir le message
    Bonjour,

    J'ai créé une ligne de commande à base de find qui scanne des répertoires de mon disque, et extrait des données des fichiers xml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    find /rep_journaux/ -maxdepth 2 -name *xml -exec perl -ne '@t=/<nom_journal>(.*?)<\/nom_journal><date>(.*?)<\/date>/g; print "@t\n"' {} \;
    Il suffit d'utiliser $ARGV, il contient le nom du fichier que Perl est en train de lire à partir des options :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    find /rep_journaux/ -maxdepth 2 -name *xml -exec perl -ne '@t=/<nom_journal>(.*?)<\/nom_journal><date>(.*?)<\/date>/g; print "$ARGV : @t\n"' {} \;
    --
    Jedaï

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 17
    Par défaut
    Ok, par contre, j'ai toujours une erreur de syntaxe...

    /usr/bin/find: Paramètre manquant pour « -exec »

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    system(`/usr/bin/find /rep/ -name *xml -exec /usr/bin/perl -ne '@t=/<nom_journal>(.*?)<\/nom_journal><date>(.*?)<\/date>/g; print \"@t\n\"' {} \;`);
    Une idée ?

  4. #4
    Expert confirmé
    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
    Par défaut
    Citation Envoyé par Flyer007 Voir le message
    Ok, par contre, j'ai toujours une erreur de syntaxe...

    /usr/bin/find: Paramètre manquant pour « -exec »

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    system(`/usr/bin/find /rep/ -name *xml -exec /usr/bin/perl -ne '@t=/<nom_journal>(.*?)<\/nom_journal><date>(.*?)<\/date>/g; print \"@t\n\"' {} \;`);
    Une idée ?
    Il fallait le dire que tu allais foutre ça dans un system() ! Là tu as des @ qu'il faudrait "échapper" avec un antislash \.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    system(`/usr/bin/find /rep/ -name *xml -exec /usr/bin/perl -ne '\@t=m{<nom_journal>(.*?)</nom_journal><date>(.*?)</date>}g; print "\@t\\n"' {} \\;`);
    Je pense que ça devrait être bon, mais ce genre de ligne de commande est un cauchemard à échapper correctement pour arranger les systèmes de quote du shell et de Perl...
    Pourquoi ne pas tout faire en Perl ?

    --
    Jedaï

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 17
    Par défaut
    En fait, j'avais commencé à le faire en perl entièrement et ça devenait une usine à gaz entre le mode "recherche", "balayage des répertoires", "lecture et extraction des données puis actions", et je me suis dit que le faire en 1 seule ligne de commande allait prendre moins de ressources et allait le faire plus vite... Non ?

  6. #6
    Expert confirmé
    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
    Par défaut
    Citation Envoyé par Flyer007 Voir le message
    En fait, j'avais commencé à le faire en perl entièrement et ça devenait une usine à gaz entre le mode "recherche", "balayage des répertoires", "lecture et extraction des données puis actions", et je me suis dit que le faire en 1 seule ligne de commande allait prendre moins de ressources et allait le faire plus vite... Non ?
    Probablement pas ! Là tu crée un processus perl pour chaque fichier à visiter, sans parler du fait que File::Find est normalement plus rapide que find (sous Linux, d'après la doc, je n'ai pas testé...).

    Pour éviter les usines à gaz, il faut séparer strictement les fonctionnalités en sous-routines :
    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
    #! /usr/bin/perl
    use strict; use warnings;
    use File::Find;
     
    my $directory = shift;
     
    find( \&xmlFile, $directory );
     
    sub xmlFile {
       if( m/\.xml$/i ) {
          extractInfo($_);
       }
    }
     
    sub extractInfo {
       local (@ARGV) = shift;
       while(<>) {
          my @t = m{<nom_journal>(.*?)</nom_journal><date>(.*?)</date>}g;
          print "$ARGV : @t\n";
       }
    }
    Par ailleurs, comme je ne sais pas ce que tu veux faire de ces données, je les imprime simplement mais je pourrais aussi les stocker dans une structure de donnée complexe (ce qui serait plus difficile à faire avec le shell... sauf en parsant le résultat).

    NB : Il y a un gros problème sur ton script : soit tu utilises les backquotes ` `, soit tu utilises system(), mais pas les deux en même temps !!

    --
    Jedaï

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 13/06/2008, 20h33
  2. Réponses: 4
    Dernier message: 06/05/2008, 19h59
  3. Comment traiter les données reçues avec WinSock ?
    Par Shredder dans le forum Web & réseau
    Réponses: 3
    Dernier message: 01/10/2007, 13h54
  4. [VB 6.3] Traiter les données d'un fichier
    Par yaya54 dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 21/02/2006, 14h00
  5. Réponses: 4
    Dernier message: 18/08/2003, 09h53

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