diff --git "a/outils/extrait-xml-\303\251diteur/README.md" "b/outils/extrait-xml-\303\251diteur/README.md" index 599d2e9..d88d3d6 100644 --- "a/outils/extrait-xml-\303\251diteur/README.md" +++ "b/outils/extrait-xml-\303\251diteur/README.md" @@ -9,20 +9,26 @@ ### Usage ``` - extraitXmlEditeur.pl -r répertoire -n nombre_fichiers -m motif [ -l log ] - extraitXmlEditeur.pl -f fichier [ -l log ] + extraitXmlEditeur.pl -r répertoire [ -e expression_régulière ] [ -l log ] + extraitXmlEditeur.pl -f fichier [ -e expression_régulière ] [ -l log ] extraitXmlEditeur.pl -h ``` ### Options ``` - -f indique le nom du fichier “.zip” contenant le fichier XML éditeur à extraire. - -h affiche cette aide. - -l indique le nom du fichier “log” recevant les messages d’erreur du programme. - -m indique le préfixe utilisé au début du nom des fichiers “.zip” du répertoire donné par - l’option “-r”. - -n indique le nombre de fichier “.zip” attendus. + -e indique l’expression régulière à utiliser pour identifier le fichier XML éditeur + dans l’archive “.zip” (à mettre entre simple ou doubles quotes) + -f indique le nom du fichier “.zip” contenant le fichier XML éditeur à extraire + -h affiche cette aide + -l indique le nom du fichier “log” recevant les messages d’erreur (ou autres) du programme + (**N.B.** : ce fichier n’est pas écrasé lorsque l’on relance le programme) -r indique le répertoire où se trouve les fichiers “.zip” déchargés par le programme “harvestCorpus.pl” et d’où doivent être extrait les fichiers XML éditeurs. ``` +### Exemples +``` + extraitXmlEditeur.pl -r Arthopodes -l logExtraitXml.txt + extraitXmlEditeur.pl -f Arthropodes/arthropodes_000125.zip -e '\.article' + +``` \ No newline at end of file diff --git "a/outils/extrait-xml-\303\251diteur/extraitXmlEditeur.pl" "b/outils/extrait-xml-\303\251diteur/extraitXmlEditeur.pl" index 64a22bd..6ec4f8f 100755 --- "a/outils/extrait-xml-\303\251diteur/extraitXmlEditeur.pl" +++ "b/outils/extrait-xml-\303\251diteur/extraitXmlEditeur.pl" @@ -11,36 +11,73 @@ use Getopt::Long; my ($programme) = $0 =~ m|^(?:.*/)?(.+)|; +my $usage = "Usage : \n" . + " $programme -r répertoire [ -e expression_régulière ] [ -l log ] \n" . + " $programme -f fichier [ -e expression_régulière ] [ -l log ] \n" . + " $programme -h \n"; -my $version = "1.0.9"; -my $dateModif = "9 Février 2018"; +my $version = "1.3.0"; +my $dateModif = "13 Mars 2018"; # Variables nécessaires pour les options my $aide = undef; +my $expression = undef; my $fichier = undef; my $log = undef; my $motif = undef; my $nombre = undef; -my $pdf = undef; +# my $pdf = undef; my $repertoire = undef; # integre les options que l'on peut donner en lancant le programme eval { $SIG{__WARN__} = sub {usage(1);}; GetOptions( + "expression=s" => \$expression, "fichier=s" => \$fichier, "help" => \$aide, "log=s" => \$log, "motif=s" => \$motif, "nombre=i" => \$nombre, - "pdf" => \$pdf, +# "pdf" => \$pdf, "repertoire=s" => \$repertoire, ); }; $SIG{__WARN__} = sub {warn $_[0];}; +if ( $aide ) { + print "\nProgramme : \n"; + print " “$programme”, version $version ($dateModif)\n"; + print " Outil qui permet d'extraire le fichier XML éditeur d’une \n"; + print " archive ZIP et de le renommer pour lui donner la même racine \n"; + print " que le document auquel il fait référence. Il travaille sur \n"; + print " un fichier ou sur un répertoire de fichiers “.zip”. \n\n"; + print "$usage\n"; + print "Options : \n"; + print " -e indique l’expression régulière à utiliser pour identifier \n"; + print " le fichier XML éditeur dans l’archive “.zip” \n"; + print " -f donne le nom du fichier “.zip” contenant le fichier XML à \n"; + print " extraire \n"; + print " -h affiche cette aide \n"; + print " -l indique le nom du fichier “log” où le programme écrit les \n"; + print " messages d’erreur où autres (N.B. : ce fichier n’est pas \n"; + print " écrasé lorsque l’on relance le programme) \n"; + print " -r indique le nom du répertoire où se trouvent les fichiers \n"; + print " “.zip” à traiter \n\n"; + print "Exemples : \n"; + print " $programme -r Arthropodes -l logExtraitXml.txt \n"; + print " $programme -f Arthropodes/arthropodes_000125.zip -e '\\.article' \n"; + print " \n"; + + + exit 0; + } + usage(2) if not $repertoire and not $fichier; -usage(2) if $repertoire and (not $nombre or not $motif); + +if ( $expression ) { + $expression = qr/$expression/; + } if ( $log ) { if ( -f $log ) { @@ -72,45 +109,61 @@ exit 3; } - if ( $nombre < 1 ) { - print STDERR "Erreur : le nombre de fichier doit être un entier positif\n"; - exit 4; + my @restant = (); + if ( defined $nombre ) { + if ($nombre < 1 ) { + print STDERR "Erreur : le nombre de fichier doit être un entier positif\n"; + exit 4; + } + foreach my $valeur (1 .. $nombre) { + $restant[$valeur] = 1; + } } - my @restant = (); - foreach my $valeur (1 .. $nombre) { - $restant[$valeur] = 1; - } opendir(DIR, $repertoire) or die "$!,"; - my @fichiers = sort grep(/^${motif}_?\d+\.zip\z/, readdir DIR); + my @fichiers = (); + if ( defined $motif ) { + @fichiers = sort grep(/^${motif}_?\d+\.zip\z/, readdir DIR); + } + else { + @fichiers = sort grep(/^.+\.zip\z/, readdir DIR); + } closedir DIR; foreach my $fichier (@fichiers) { - my ($valeur) = $fichier =~ /^${motif}_?(\d+)\.zip/; - my ($base) = $fichier =~ /^(${motif}_?\d+)\.zip/; - $restant[$valeur] = 0; + my $base = ""; + my $valeur = ""; + if ( defined $motif ) { + ($base, $valeur) = $fichier =~ /^(${motif}_?(\d+))\.zip/; + $restant[$valeur] = 0; + } + else { + ($base, $valeur) = $fichier =~ /^(.+?_?(\d+))\.zip/; + } if ( -f "$repertoire/$base.xml" ) { next; } traite($repertoire, $fichier, $base); } - my $absent = 0; - foreach my $valeur (1 .. $nombre) { - if ( $restant[$valeur] ) { - $absent ++; - print LOG "Pas de fichier ZIP pour document n° $valeur\n"; + if ( defined $nombre ) { + my $absent = 0; + foreach my $valeur (1 .. $nombre) { + if ( $restant[$valeur] ) { + $absent ++; + print LOG "Pas de fichier ZIP pour document n° $valeur\n"; + } + } + if ( $absent ) { + print LOG "Total : $absent fichiers ZIP absents\n"; } } - if ( $absent ) { - print LOG "Total : $absent fichiers ZIP absents\n"; - } } elsif ( $fichier ) { - my ($chemin, $nom, $base) = $fichier =~ m|^(.*/)((.+)\.[Zz][Ii][Pp])|o; + my ($chemin, $nom, $base) = $fichier =~ m|^(.*/)?((.+)\.[Zz][Ii][Pp])|o; $chemin = "." if not $chemin; traite($chemin, $nom, $base); } @@ -123,10 +176,7 @@ { my $code = shift; -print STDERR "\n"; -print STDERR "Usage : $programme -r répertoire -n nombre_fichiers -m motif [ -l log ] \n"; -print STDERR " $programme -f fichier [ -l log ] \n"; -print STDERR " $programme -h \n"; +print STDERR "\n$usage"; exit $code; } @@ -150,21 +200,33 @@ open(INP, "unzip -l $directory/$file 2>&1 |") or die "$!,"; while() { + s/^\s+//o; + s/[\n\r]+//o; if ( /\.pdf\s*$/io ) { - my @tmp = split(/\s+/); + my @tmp = split(/\s+/, $_, 4); push(@pdf, $tmp[$#tmp]); erreur("Erreur sur fichier \"$file\"", 5) if $tmp[$#tmp] !~ /\.pdf\z/i; } elsif ( /\.xml\s*$/io ) { - my @tmp = split(/\s+/); + my @tmp = split(/\s+/, $_, 4); push(@xml, $tmp[$#tmp]); erreur("Erreur sur fichier \"$file\"", 6) if $tmp[$#tmp] !~ /\.xml\z/i; } elsif ( /\.xml\b/io ) { - my @tmp = split(/\s+/); + my @tmp = split(/\s+/, $_, 4); push(@xml, $tmp[$#tmp]); erreur("Erreur sur fichier \"$file\"", 6) if $tmp[$#tmp] !~ /\.xml\b/i; } + elsif ( /\.nxml\s*$/io ) { + my @tmp = split(/\s+/, $_, 4); + push(@xml, $tmp[$#tmp]); + erreur("Erreur sur fichier \"$file\"", 6) if $tmp[$#tmp] !~ /\.nxml\z/i; + } + elsif ( $expression and /$expression\s*$/io ) { + my @tmp = split(/\s+/, $_, 4); + push(@xml, $tmp[$#tmp]); + erreur("Erreur sur fichier \"$file\"", 6) if $tmp[$#tmp] !~ /$expression\z/i; + } elsif ( /unzip: +cannot find zipfile directory/o ) { print LOG "Le fichier \"$file\" n'est pas une archive ZIP\n"; $type = 1; @@ -222,12 +284,12 @@ my @cibles = grep(/^$debut.xml\z/i, @xml); if ( $#cibles == 0 ) { my ($racine) = $debut =~ m|^(?:.*/)?(.+)|o; - system "unzip -j $directory/$file $cibles[0] > /dev/null"; + system "unzip -jo \"$directory/$file\" \"$cibles[0]\" > /dev/null"; if ( -f "$racine.xml" ) { - system "mv $racine.xml $directory/$base.xml" + system "mv \"$racine.xml\" \"$directory/$base.xml\"" } elsif ( -f "$racine.XML" ) { - system "mv $racine.XML $directory/$base.xml" + system "mv \"$racine.XML\" \"$directory/$base.xml\"" } else { print LOG "Erreur : pas de fichier \"$racine.xml\" extrait de \"$file\"\n"; @@ -243,25 +305,38 @@ @cibles = grep(/^$debut.xml\z/i, @xml); if ( $#cibles == 0) { my ($racine) = $debut =~ m|^(?:.*/)?(.+)|o; - system "unzip -j $directory/$file $cibles[0] > /dev/null"; + system "unzip -jo \"$directory/$file\" \"$cibles[0]\" > /dev/null"; if ( -f "$racine.xml" ) { - system "mv $racine.xml $directory/$base.xml" + system "mv \"$racine.xml\" \"$directory/$base.xml\"" } elsif ( -f "$racine.XML" ) { - system "mv $racine.XML $directory/$base.xml" + system "mv \"$racine.XML\" \"$directory/$base.xml\"" } else { print LOG "Erreur : pas de fichier \"$racine.xml\" extrait de \"$file\"\n"; } } elsif ( $#xml == 0 ) { - my ($entree, $xml) = $xml[0] =~ m|^((?:.*/)?(.+\.xml.*))|; - system "unzip -j $directory/$file $entree > /dev/null"; - if ( -f "$xml" ) { - system "mv $xml $directory/$base.xml" + if ( $expression and $xml[0] =~ m|^((?:.*/)?(.*$expression))| ) { + my $entree = $1; + my $xml = $2; + system "unzip -jo \"$directory/$file\" \"$entree\" > /dev/null"; + if ( -f "$xml" ) { + system "mv \"$xml\" \"$directory/$base.xml\"" + } + else { + print LOG "Erreur : pas de fichier \"$xml\" extrait de \"$file\"\n"; + } } else { - print LOG "Erreur : pas de fichier \"$xml\" extrait de \"$file\"\n"; + my ($entree, $xml) = $xml[0] =~ m|^((?:.*/)?(.+\.n?xml.*))|io; + system "unzip -jo \"$directory/$file\" \"$entree\" > /dev/null"; + if ( -f "$xml" ) { + system "mv \"$xml\" \"$directory/$base.xml\"" + } + else { + print LOG "Erreur : pas de fichier \"$xml\" extrait de \"$file\"\n"; + } } } else { @@ -271,9 +346,9 @@ } elsif ( $#xml == 0 ) { my ($entree, $xml) = $xml[0] =~ m|^((?:.*/)?(.+\.xml))|; - system "unzip -j $directory/$file $entree > /dev/null"; + system "unzip -jo \"$directory/$file\" \"$entree\" > /dev/null"; if ( -f "$xml" ) { - system "mv $xml $directory/$base.xml" + system "mv \"$xml\" \"$directory/$base.xml\"" } else { print LOG "Erreur : pas de fichier \"$xml\" extrait de \"$file\"\n";