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

Modules Perl Discussion :

[XML] [scan folder] Recherche nouveaux fichiers XML+parsing


Sujet :

Modules Perl

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 10
    Points : 3
    Points
    3
    Par défaut [XML] [scan folder] Recherche nouveaux fichiers XML+parsing
    Bonjour à tous,

    Je débute en Perl et j'aurais quelques questions à vous poser.
    Je suis en train de faire un script Perl qui me permet de parser un fichier XML, d'en tirer le contenu et de l'ajouter dans une BD MySQL. Jusqu'ici tout va bien.

    La chose est telle: il faudrait que le script scanne le répertoire où viennnent se mettre (tous seuls comme des grands) ces fichiers XML et sache lesquels il a déjà traité. De plus il faudrait être sûr que le fichier à parser a bien été copié dans son intégralité (je pense pour cela simplement regarder si la balise racine du ficheir XML a bien été fermée. Possible?).

    Quelqu'un peut-il me donner une piste pour une telle "surveillance de répertoire"? Une fonction à utiliser ou peut-être un module?

    Merci d'avance et bonne journée!
    A+

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 22
    Points : 26
    Points
    26
    Par défaut
    J'utilise trois repertoire

    in : les fichier qui arrive
    old:les fichier traiter
    bad: les fichier qui on poser probleme

    Je scan regulierement le repertoir in a l'aide
    d'opendir http://www.enstimac.fr/Perl/DocFr/pe...l#item_opendir

    Et je deplace le fichier dans le bon repertoir (old ou bad)
    en fonction du resultat de
    mon parsing XMl et/ou de mon integration en db

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    Merci pour votre réponse!

    Pourriez-vous me montrer votre code?
    J'ai quelques problèmes pour copier les fichiers des répertoires...

    Merci d'avance!

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 22
    Points : 26
    Points
    26
    Par défaut
    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
     
    sub get_indir_file {
        print "\n-NewsFtp2Db : get_indir_file $option{indir} \n";
        opendir(DIR, $option{indir}) or  die "can't opendir  $option{indir}: $!";
        my @dots =  readdir(DIR);
        closedir DIR;
        foreach my $file (@dots) {
    	if (substr($file,0,1) ne ".") {
    	    eval {	
    		_parse_xml_file($option{indir}."/".$file); 
    	    };
    	    if ($@) { 
    		print "\nErreur lors de du parsing \n";
    		print  $@."\n";
    		print $file."\n";		
    		system("mv ".$option{indir}."/".$file." ".$option{baddir}."/".$file);
    	    }
    	    else {
    		system("mv ".$option{indir}."/".$file." ".$option{olddir}."/".$file);
    	    }
    	}
        }
    }

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Merci beaucoup!

    Ca m'a l'air compliqué mais je vais regarder tout ça!

    A+

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    Tout d'abord, merci pour vos réponses!

    Dans le répertoire où je souhaite prendre des fichiers et les copier dans un autre dossier, on trouve des fichiers de ce type:

    328983-20040914-200044.xml.processed

    Ils ont tous la même construction, dont la date au millieu qui serait très utile. En effet, je voudrais copier uniquement ceux dont la date est égale à "20040914" (par exemple). Y-a-t-il une fonction me permettant d'analyser les noms de ces fichiers et d'en tirer la date en question?

    Merci d'avance! a+

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 22
    Points : 26
    Points
    26
    Par défaut
    Normalement tu peut traiter ton nom de fichier comme n'importe quel chaine de caractere en Perl

  8. #8
    Mr6
    Mr6 est déconnecté
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 607
    Points : 794
    Points
    794
    Par défaut
    Franch.g t'a donné un bon tuyau avec le site de l'enstimac, pour plus de détails sur tes noms de fichiers à déplacer, fais le tri dès le départ : http://www.enstimac.fr/Perl/DocFr/perlfunc.html#item_readdir

    Donc, pour compléter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    opendir(DIR, $option{indir}) or  die "can't opendir  $option{indir}: $!"; 
        my @dots =  grep {/\d*-20040914-\d*\.xml/ && -f $option{indir}} readdir(DIR); 
    closedir DIR;
    devrait te permettre de trouver tes fichiers xml avec ta date.

    @+
    Mr6

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    C'est tout bon, ça marche, je vous remercie pour vos réponses!

    Autre question, pensez-vous qu'il serait possible d'enlever l'extension .processed de ces fichiers pour en arriver à des fichier en .xml? Il s'agit en fait de l'extension, je n'arrive pas à savoir s'il est possible de la traiter...


    Merci encore à vous et bonne semaine!

  10. #10
    Mr6
    Mr6 est déconnecté
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 607
    Points : 794
    Points
    794
    Par défaut
    bah en stockant ds une nouvelle variable le nom ke tu veux donner à ton fichier, et en faisant ton mv en conséquence... (cf la substition pour renommer le contenu de $file)

    @+
    Mr6

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    J'ai fait comme ça, ça a l'air de fonctionner:

    $ext1 = ".processed";
    $ext2 = ".";

    foreach $file(@in_list){
    $newfile = $file;
    $newfile=~ s/$ext1/$ext2/g;
    rename("$in_path/$file","$in_path/$newfile");
    }
    Avec $ext1 pour ancienne extension et $ext2 pour la nouvelle (en l'occurence, rien).

    Le fichier devient donc en .xml

    A+ merci!

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    Tout d'abord merci pour votre aide, j'ai bien pu avancer dans mon travail.

    J'aurais une autre question. Ci-dessous un bout de code qui m'ouvre et me liste deux dossiers:

    $in_path = "c:/myscripts/dir/in/";
    opendir (IN, $in_path) || die ("Impossible d'ouvrir le répertoire");
    @in_list = grep(/\.xml/i, readdir IN);

    $old_path = "c:/myscripts/dir/old/";
    opendir (OLD, $old_path) || die ("Impossible d'ouvrir le répertoire");
    @old_list = grep(/\.xml/i, readdir OLD);
    Je voudrais comparer les fichiers par leur nom en pouvant savoir s'il l'un ou l'autre se trouve dans les deux dossier ou non.

    J'ai essayé cela:

    foreach $in_element(@in_list) {

    if ($in_element =~ $old_element) {
    print $in_element.": A double\n";
    }
    else {
    print $in_element.": OK\n";
    }
    }
    Mais cela ne marche pas, puisqu'il ne prend pas tous les éléments de @old_list en compte...

    Quelqu'un peut-il m'aider?
    Je vous remercie d'avance

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    [quote="Larry8409"]Bonjour,

    Tout d'abord merci pour votre aide, j'ai bien pu avancer dans mon travail.

    J'aurais une autre question. Ci-dessous un bout de code qui m'ouvre et me liste deux dossiers:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $in_path = "c:/myscripts/dir/in/";
    opendir (IN, $in_path) || die ("Impossible d'ouvrir le répertoire");
    @in_list = grep(/\.xml/i, readdir IN);
     
    $old_path = "c:/myscripts/dir/old/";
    opendir (OLD, $old_path) || die ("Impossible d'ouvrir le répertoire");
    @old_list = grep(/\.xml/i, readdir OLD);
    Je voudrais comparer les fichiers par leur nom en pouvant savoir s'il l'un ou l'autre se trouve dans les deux dossier ou non.

    J'ai essayé cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    foreach $in_element(@in_list) {
     
      if ($in_element =~ $old_element) {
        print $in_element.": A double\n";
      }
      else {
        print $in_element.": OK\n";
      }
    }
    Mais cela ne marche pas, puisqu'il ne prend pas tous les éléments de @old_list en compte...

    Quelqu'un peut-il m'aider?
    Je vous remercie d'avance

  14. #14
    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
    C'est l'astuce classique en Perl : utiliser un hash ! Il y a 50 variations, mais en voici une relativement compréhensible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    my %double_list;
    @double_list{@old_list} = (1) x (@old_list);
     
    foreach $elt (@in_list) {
      if $double_list{$elt}{
        print $elt.": A double\n" ;
      }
      else{ 
        print $elt.": OK\n"  
      }
    }
    Il y a plus idiomatique mais cette version est plutôt compréhensible et fait exactement la même chose que ce que ton script est censé faire.


    --
    Jedaï

  15. #15
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Ca marche à merveille!
    Merci infiniment!
    A+

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 28/02/2012, 18h30
  2. [DOM] Reconstruire un fichier XML à partir d'un autre fichier XML
    Par Jonvols dans le forum Format d'échange (XML, JSON...)
    Réponses: 12
    Dernier message: 13/11/2010, 01h49
  3. Réponses: 5
    Dernier message: 23/03/2009, 16h36
  4. [XSLT] generer un fichier xml optmise d'un autre fichier xml
    Par maguie dans le forum XSL/XSLT/XPATH
    Réponses: 22
    Dernier message: 08/04/2008, 15h45
  5. Réponses: 4
    Dernier message: 28/10/2005, 09h59

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