Mini-projet bases de données / Perl - go: dept

Transcription

Mini-projet bases de données / Perl - go: dept
Mini-projet bases de données / Perl
M1 Bioinformatique
1
Présentation du sujet
L’objectif de ce mini-projet est de récupérer des données dans un certain
format, de les insérer dans une base de données relationnelles puis d’interroger
cette base afin de construire plusieurs tableaux récapitulatifs. Ce travail utilisera la base de données 2014 des communes, départements et régions Françaises
qui est disponible sur le site de l’INSEE (http://www.insee.fr/fr/methodes/
nomenclatures/cog/telechargement.asp). Nous utiliserons les fichiers au format DBF.
Les données sont structurées de la façon suivante : la France est découpée
en régions, qui sont découpées en départements (qui sont eux même découpés en arrondissement, et enfin les arrondissement sont découpés en cantons).
Chaque entité (région et département) possède un nom unique et un chef-lieu
qui est une commune. Dans la base de données à créer, une commune n’appartient qu’à un seul département. En suivant la hiérarchie région-département, on
doit être capable de retrouver facilement la région d’appartenance d’une commune. A ces données, nous ajouterons des statistiques sur les équipements et
services des communes pour l’enseignement supérieur en 2013. Il faut télécharger la base au niveau communal et arrondissement municipal au format XLS
zippé depuis http://www.insee.fr/fr/themes/detail.asp?reg_id=99&ref_
id=equip-serv-ens-sup-form-serv. Nous utiliserons uniquement la feuille de
calcul nommée ’COM’.
2
Travail à faire
2.1
Construction de la base de données relationnelles
— A partir de la description donnée ci-dessus, vous devez modéliser une base
de données en troisième forme normale avec un maximum de contraintes
d’intégrité. Vous devez rédiger un document qui présente un modèle
entités-associations et un modèle relationnel qui décrivent votre base de
données le plus précisément possible.
— Une fois la base de données modélisées, vous devez l’implémenter dans le
serveur PostgreSQL.
1
— A l’aide d’un ou plusieurs scripts PERL, vous devez remplir automatiquement la base de données à partir des fichiers téléchargés sur le site de
l’INSEE.
2.2
Exploitation de la base de données
A partir de la base de données, l’objectif est de construire un rapport de
synthèse (par exemple sous la forme de tableaux) en HTML (vous pouvez faire
plusieurs fichiers). Ce rapport est constitué d’une partie générale et d’une partie
détaillée en fonction d’une liste d’éléments passée en paramètre au script Perl de
construction du fichier HTML. Tous les opérateurs mathématiques nécessaires
sont déjà implémentés dans la base de données PostgreSQL.
Dans la partie générale, il faudra pouvoir naviguer dans une arborescence
qui montre pour chaque région, la liste de ses départements. A côté du nom de
chaque entité (région ou département) devra apparaître :
— Le nom de son chef lieu
— Le nombre de communes de cette entitée
— la population en 2009
— Le nombre d’instituts universitaires, d’unité de formation et de recherche
(UFR), d’écoles d’ingénieurs, de résidences universitaires et de restaurants universitaires.
Des statistiques nationales devront aussi être calculées :
— Région/département avec le plus/le moins d’instituts universitaires, d’UFR,
d’écoles d’ingénieurs, de résidences universitaires et de restaurants universitaires
— Nombre moyen et écart-type du nombre d’instituts universitaires, d’UFR,
d’écoles d’ingénieurs, de résidences universitaires et de restaurants universitaires pour chaque région et département
— Indiquer si il y a une corrélation linéaire entre le nombre d’UFR et le
nombre de restaurants universitaires (idem avec les résidences universitaires) au niveau national et pour chaque région.
Les informations pour la partie détaillée seront passées en paramètre au script
Perl sous la forme d’un fichier structuré entite:nom. Le fichier comportera
un couple d’éléments par ligne. Un exemple pourrait être (les majuscules et
minuscules ne sont pas forcément respectées) :
commune:bordeaux
region:aquitaine
departement:aveyron
Selon le type d’entité géographique, il faudra construire un tableau récapitulatif
de toutes les informations disponibles :
— pour une région : chef-lieu, nombre de départements, répartition en pourcentage dans chaque département des instituts universitaires, unité de
formation et de recherche (UFR), écoles d’ingénieurs, résidences universitaires et restaurants universitaires.
2
— pour un département : chef-lieu, région d’appartenance, nombre d’instituts universitaires, d’unité de formation et de recherche (UFR), d’écoles
d’ingénieurs, de résidences universitaires et de restaurants universitaires.
— pour une commune : région, département, nombre d’instituts universitaires, d’unité de formation et de recherche (UFR), d’écoles d’ingénieurs,
de résidences universitaires et de restaurants universitaires.
Annexes
A
Ajout et compilation d’un module Perl externe
(sans avoir les droits root)
Si un module n’est pas installé, Perl dispose d’un module spécifique qui est
une interface sur la base de données CPAN (voir http://www.cpan.org). Cette
interface est appelée avec la ligne de commande suivante : perl -MCPAN -e shell.
Une fois configurée, il faut redéfinir quelques variables afin de pouvoir installer
les modules convenablement. Avec la commande o conf (l’aide est accessible
avec ? ), il faut définir make_install_arg à
INSTALLMAN3DIR=/net/cremi/votre_username/perl/man3/
et makepl_arg à
PREFIX=/net/cremi/votre_username/perl/lib
Donc pour changer makepl_arg, il faudra utiliser :
o conf makepl_arg ’PREFIX=/net/cremi/votre_username/perl/lib’
Ensuite, comme le précise la commande, n’oubliez pas de taper o conf commit
pour enregistrer vos modifications de façon permanente. Si l’installation d’un
module échoue car il manque certaines dépendances, il faudra définir avant le
lancement de CPAN la variable d’environnement PERL5LIB afin d’indiquer à
Perl où se trouve les modules à charger (5.14.2 est la version courante de Perl.
A vérifier avec perl -v). En effet, les dépendances seront installées dans le même
répertoire que les modules supplémentaires sachant que ce répertoire ne fait pas
partie des chemins de recherche de perl par défaut.
export PERL5LIB=\
/net/cremi/votre_username/perl/lib/share/perl/5.14.2/\
:$PERL5LIB
N’oubliez pas de remplacer “votre_username” par votre nom d’utilisateur. Avant
de pouvoir utiliser les nouveaux modules, il faut indiquer à l’interpréteur Perl
où les trouver. Vous pouvez soit utiliser la variable PERL5LIB définie précédemment (et ne pas oublier de modifier les scripts de lancement de votre interpréteur de commande pour éviter d’avoir à tout retaper à chaque fois) ou
utiliser le pragma “lib” ajouté au début de vos scripts :
3
#! /usr/bin/perl
use strict;
use warnings;
use lib "/net/cremi/votre_username/perl/lib/share/perl/5.14.2/”;
...
B
Structure d’un fichier DBF
Un fichier DBF (DBASE) peut-être vu comme une relation dans un modèle
relationnel. Ce fichier peut être lu par tout tableur digne de ce nom. La première
ligne de chaque colonne est toujours au format nom, type, longueur : le champ
nom indique le nom de l’attribut, le type indique le type de données de la colonne
(par ex. c pour un caractère) et la longueur donne la taille maximale du champ.
Par exemple, une colonne d’en-tête VILLE, c, 70 représente un attribut qui
s’appelle VILLE de type caractère et de longueur maximale 70.
C
Lecture des fichiers DBF et XLS avec Perl
Plusieurs moyens sont disponibles pour lire des fichiers DBF et XLS. Nous
utiliserons le pilote DBD::XBase du module DBI qui permet d’utiliser les fichiers
DBF comme une base de données. Chaque fichier DBF est ainsi vu comme une
table. L’interrogation des fichiers s’effectue à l’aide du langage SQL. Pour les
fichier XLS, nous utiliserons Spreadsheet::ParseExcel.
D
Utilisation des modules Perl
Pour chaque module décrit ici, il existe beaucoup de documentations plus
ou moins obsolètes sur Internet. N’oubliez pas que “Google” est votre ami !
D.1
Utilisation basique du pilote DBD::XBase
#!/usr/bin/perl
use strict;
use DBI;
my $dbh = DBI->connect("DBI:XBase:.")
or die $DBI::errstr;
my $sth = $dbh->prepare("select NCC from reg2011")
or die $dbh->errstr();
$sth->execute() or die $sth->errstr();
while (my @data = $sth->fetchrow_array()) {
print "$data[0]\n";
}
4
$sth->finish();
Chaque fichier DBF situé dans le répertoire courant (le point après DBI:XBase:)
est considéré comme une table (ne pas mettre l’extension .dbf).
D.2
Utilisation basique du pilote DBD::Pg
Soit une relation test(a, b) où a et b sont des entiers.
#!/usr/bin/perl
use strict;
use DBI;
# connect
my $dbh = DBI->connect("DBI:Pg:
dbname=bpinaud;host=dbserver",
"bpinaud", "", {’RaiseError’ => 1});
# execute INSERT query
my $rows = $dbh->do("INSERT INTO test VALUES (5,3)");
print "$rows row(s) affected\n";
# execute SELECT query
my $sth = $dbh->prepare("SELECT * FROM test");
my $num = $sth->execute();
print “query returned $num rows\n”;
# iterate through resultset
while(my $ref = $sth->fetchrow_hashref()) {
print "$ref->{’a’} $ref->{’b’}\n";
}
$sth->finish;
$dbh->disconnect();
D.3
Utilisation basique du module Spreadsheet::ParseExcel
#!/usr/bin/perl
use strict;
use warnings;
use Spreadsheet::ParseExcel;
my $parser
= Spreadsheet::ParseExcel->new();
#may take some time
my $workbook = $parser->parse(’equip-serv-ens-sup-form-serv-com-11.xls’);
if ( !defined $workbook ) {
die $parser->error(), ".\n";
}
my $worksheet;
foreach ( $workbook->worksheets() ) {
5
$worksheet = $_;
last if $_->get_name() eq ’COM’;
}
my ( $row_min, $row_max ) = $worksheet->row_range();
my ( $col_min, $col_max ) = $worksheet->col_range();
for my $row ( 6 .. $row_max ) {
for my $col ( $col_min .. $col_max ) {
my $cell = $worksheet->get_cell( $row, $col );
next unless $cell;
print "Row, Col
= ($row, $col)\n";
print "Value
= ", $cell->value(),
"\n";
print "Unformatted = ", $cell->unformatted(), "\n";
print "\n";
}
}
6

Documents pareils

Formation programmation Perl DBI avec MySQL Plan de cours

Formation programmation Perl DBI avec MySQL Plan de cours Formation programmation Perl DBI avec MySQL Plan de cours

Plus en détail