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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 10
    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
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 22
    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
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 10
    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
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 22
    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
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

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

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

    A+

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 10
    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
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 22
    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 émérite

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

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 608
    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
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 10
    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 émérite

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

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 608
    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
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 10
    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
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 10
    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
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 10
    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 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
    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
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 10
    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