diff --git a/stats-revues/README.md b/stats-revues/README.md new file mode 100644 index 0000000..a08bfc6 --- /dev/null +++ b/stats-revues/README.md @@ -0,0 +1,47 @@ +stats-revues +============ + +Outil de statistiques descriptives sur les métadonnées moissonnées sur la base +**ISTEX** par **m2m** portant principalement sur les revues et donnant le titre, +l’ISSN, la période de publication, les catégories WoS et Science-Metrix. + +Par défaut, cet outil traite seulement les métadonnées des documents ayant le +type de publication “journal”. Mais on peut limiter les statistiques à un ou +plusieurs types de publication et/ou document comme “article” ou “research-article”. + +Le résultat est un fichier UTF-8 avec BOM comportant en en-tête la liste des champs. +Ce fichier est envoyé sur la sortie standard. + +### Usage +``` + statsRevues.pl -f fichier [ -t type1[,type2]* ] +``` + +### Options +``` + -f indique le fichier de métadonnées généré par le programme “m2m.pl”. Ce + fichier est normalement compressé par “gzip”. + -t indique le type de publication et/ou de document à traiter. Par défaut, + c’est le type de publication “journal”. Si vous utilisez cette option, + la valeur par défaut est effacée. N’oubliez pas de rajouter “journal” + à votre liste de types de document si vous voulez continuer à ne + traiter que les revues. +``` + +### Exemple +``` + statsRevues.pl -f EnvironmentWoS.txt.gz + statsRevues.pl -f GeosciencesWoS.txt.gz -t journal,article,research-article +``` + +### Données extraites + +Pour l’instant, on a 7 champs : + + * nombre de documents, + * titre du périodique (ou de la monographie), + * ISSN, + * e-ISSN, + * date(s) de publication, + * liste des catégories WoS associées au périodique, + * liste des catégories Science-Metrix associées au périodique, diff --git a/stats-revues/statsRevues.pl b/stats-revues/statsRevues.pl new file mode 100755 index 0000000..65ee560 --- /dev/null +++ b/stats-revues/statsRevues.pl @@ -0,0 +1,187 @@ +#!/usr/bin/perl + + +# Déclaration des pragmas +use strict; +use utf8; +use open qw/:std :utf8/; + +# Appel des modules externes de base +use Encode; +use Getopt::Long; + +my ($programme) = $0 =~ m|^(?:.*/)?(.+)|; + +my $version = "1.2.1"; +my $dateModif = "06 Octobre 2017"; + +# Variables pour les options et variable prédéfinie +my $fichier = ""; +my $types = "journal"; +my @types = (); + +eval { + $SIG{__WARN__} = sub {usage(1);}; + GetOptions( + "fichier=s" => \$fichier, + "types=s" => \@types, + ); + }; +$SIG{__WARN__} = sub {warn $_[0];}; + +usage(2) if not $fichier; + +if ( @types ) { + $types = join(",", @types); + } + +if ( $types !~ /^\w+(-\w+)?(,\w+(-\w+)?)*\z/ ) { + print STDERR "$programme : Erreur dans l'écriture de l'option \"-t\"\n"; + exit 3; + } + +my %type = map {$_ => 1} split(/,/, $types); + +# Variables et tableaux +my %annee = (); +my %cat = (); +my %corpus = (); +my %eissn = (); +my %issn = (); +my %nb = (); +my %titre = (); + +if ( $fichier =~ /\.gz\z/ ) { + open(INP, "gzcat $fichier |") or die "$!,"; + binmode(INP, ":utf8"); + } +elsif ( $fichier eq '-' ) { + open(INP, "<&STDIN") or die "Cannot duplicate STDIN: $!,"; + } +else { + open(INP, "<:utf8", $fichier) or die "$!,"; + } + +while() { + chomp; + s/\r//go; + my @champs = split(/\t/); + my $corpus = $champs[1]; + my $type = $champs[3]; + my $issn = $champs[4]; + my $eissn = $champs[5]; + my $revue = $champs[7]; + my $annee = $champs[8]; + my $catWoS = $champs[15]; + my $catSM = $champs[16]; + + # type correct ? + my $ok = 0; + foreach my $item (split/\s*[;,]\s*/, $type) { + if ( $type{$item} ) { + $ok ++; + last; + } + } + next if not $ok; + + my $titre = $revue; + $titre =~ s/^\([^)]+\) *//o; + $titre =~ s/[\s:]*\([^)]+\)$//o; + $titre =~ s/^the +//io; + $titre =~ s/^der +//io; + $titre =~ s/^die +//io; + $titre =~ s/^les? +//io; + $titre =~ s/^la +//io; + $titre =~ s/^l\' *//io; + $titre =~ s/^du +//io; + $titre =~ s/^il +//io; + $nb{$revue} ++; + $titre{$revue} = $titre; + if ( $issn ) { + $eissn{$revue}{$eissn} ++; + } + if ( $eissn ) { + $issn{$revue}{$issn} ++; + } + if ( $annee ) { + $annee{$revue}{$annee} ++; + } + if ( $catWoS ) { + $cat{$revue}{'WoS'}{$catWoS} ++; + } + if ( $catSM ) { + $cat{$revue}{'SM'}{$catSM} ++; + } + } +close INP; + +if ( %titre ) { + print "\x{FEFF}Nb.\tTitre de revue\tISSN\te-ISSN\t"; + print "Date(s) de publication\tCatégories WoS\tCatégories Science-Metrix\n"; + } + +foreach my $revue (sort {$titre{$a} cmp $titre{$b}} keys %titre) { + print "$nb{$revue}\t$revue\t"; + if ( defined $issn{$revue} ) { + my @issn = sort keys %{$issn{$revue}}; + print join("/", grep(/./, @issn)); + } + print "\t"; + if ( defined $eissn{$revue} ) { + my @eissn = sort keys %{$eissn{$revue}}; + print join("/", grep(/./, @eissn)); + } + print "\t"; + if ( defined $annee{$revue} ) { + my @annees = sort {$a <=> $b} keys %{$annee{$revue}}; + my $debut = shift @annees; + my $fin = $debut; + while ( @annees ) { + my $annee = shift @annees; + if ( $annee = $fin + 1 ) { + $fin = $annee; + } + elsif ( $debut < $fin ) { + print "$debut-$fin,"; + $debut = $annee; + $fin = $annee; + } + else { + print "$debut,"; + $debut = $annee; + $fin = $annee; + } + } + if ( $debut < $fin ) { + print "$debut-$fin"; + } + else { + print "$debut"; + } + } + print "\t"; + if ( defined $cat{$revue}{'WoS'} ) { + my @cats = sort {$cat{$revue}{'WoS'}{$b} <=> $cat{$revue}{'WoS'}{$a} or $a cmp $b} keys %{$cat{$revue}{'WoS'}}; + print join("/", @cats); + } + print "\t"; + if ( defined $cat{$revue}{'SM'} ) { + my @cats = sort {$cat{$revue}{'SM'}{$b} <=> $cat{$revue}{'SM'}{$a} or $a cmp $b} keys %{$cat{$revue}{'SM'}}; + print join("/", @cats); + } + print "\n"; + } + + +exit 0; + + +sub usage +{ +my $code = shift; + +print STDERR "Usage : $programme -f fichier [ -t type1[,type2]* ]\n"; + +exit $code; +}