Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[Novice] Parser des fichiers dans plusieurs répertoires et créer une base de donnée

19 réponses
Avatar
noone
Bonjour,

Tout d'abord je suis totalement novice avec Perl.
Je suis en train de réaliser une base d'exercices avec LaTeX.
J'ai un exercice et son corrigé par répertoire. (exercice.tex et
correction.tex)
je voudrais réaliser une base de donnée (un simple fichier texte suffira)

Dans chaque répertoire j'ai créé un fichier index.txt qui à l'allure
suivante

index.txt du répertoire exo00001

%CLASSE=la classe
%DOMAINE=le domaine
...


index.txt du répertoire exo00002
%CLASSE=la classe 2
%DOMAINE=le domaine 2
...


Je ne sais pas comment m'y prendre pour lire tous les fichiers index.txt
et créer la base

index_table.txt

00001 la classe le domaine
00002 la classe 2 le domaine 2
...


Je pense que c'est très basique mais encore faut-il connaitre un minimum
Perl (et peut-être même les regexp aussi)


Autre question...
Avez-vous une meilleure idée d'organisation ?

Parce que je me pose la question :
Et si je change l'organisation des fichiers index.txt par exemple, cela
ne risque pas de merder ?

Il faudrait alors être capable de faire l'inverse : regénérer chaque
index.txt à partir du gros index_table.txt.
=> 2ème script Perl

Et pour les requêtes je m'organise comment ?



Merci d'avance.
et désolé d'avoir été un peu long...

10 réponses

1 2
Avatar
Régis Caspar
wrote:
J'ai un exercice et son corrigé par répertoire. (exercice.tex et
correction.tex)
je voudrais réaliser une base de donnée (un simple fichier texte suffira)
Dans chaque répertoire j'ai créé un fichier index.txt qui à l'allure
suivante
index.txt du répertoire exo00001

%CLASSE=la classe
%DOMAINE=le domaine
...

Je ne sais pas comment m'y prendre pour lire tous les fichiers index.txt
et créer la base
index_table.txt

00001 la classe le domaine
00002 la classe 2 le domaine 2
...


Bonjour,

Quelque chose comme ça pour générer 'index_table.txt':
########################################################################
#!perl -w

use strict;
use vars qw($SEP);

# séparateur : "t" ou ";" ou autre
$SEP=";"
;

open (OUT, ">index_table.txt")
or die "Ne peut pas ouvrir 'index_table.txt' : $!n";
FILE: foreach my $file (glob '*') {
if (-d $file) {
# $file est un répertoire
if (! -e "$fileindex.txt") {
# '$fileindex.txt' existe
warn "'$fileindex.txt' n'existe pas : $!n" ;
next FILE;
}
if (not open (F, "< $fileindex.txt")) {
# '$fileindex.txt' ne s'ouvre pas
warn "Ne peut pas ouvrir '$fileindex.txt' : $!n" ;
next FILE;
}
# '$fileindex.txt' est ouvert
my @all = <F>;
my $contents = join "n", @all;
close F;
# $contents contient toutes les lignes
# de l'index séparée par 'n'
my ($classe) = $contents =~ /%CLASSE=(.*)n/;
my ($domaine) = $contents =~ /%DOMAINE=(.*)n/;
my ($num) = $file =~ /exo(d*)/;
if (!defined($num)) {
# le dossier $file n'est pas nommé correctement
warn "Dossier '$file' mal nommé n" ;
next FILE;
}
print OUT "$num$SEP$classe$SEP$domainen";
}
}
close OUT;
exit 1;
########################################################################

Note, code probablement non parfait et testé avec cette architecture de
répertoires (chaque répertoire contenant un index.txt):
.
|---bleh
|---exo00001
|---exo00002
---exo00003

Résultats :
"Dossier 'bleh' mal nommé" et index_table.txt :
00001;la classe;le domaine
00002;la classe 2;le domaine 2
00003;la classe 2;le domaine 2

--
Régis Caspar

Avatar
noone


Bonjour,

Quelque chose comme ça pour générer 'index_table.txt':
########################################################################
[]



merci

je vais tester ça...

Avatar
noone
wrote:

[]


# $file est un répertoire
if (! -e "$fileindex.txt") {
# '$fileindex.txt' existe
warn "'$fileindex.txt' n'existe pas : $!n" ;
next FILE;


j'ai quand même un problème avec ce morceau ("$fileindex.txt")
je suis sous Linux Debian
je pense que le problème viens des ou / dans les répertoires mais
n'existe-t-il pas un moyen de faire quelque chose de portable (Linux et
Windows) pour gérer les répertoires ?

Merci

Avatar
noone
Encore une autre question...

j'ai maintenant à la fin quelque chose du genre

print OUT "$num$SEP$classe$SEP$domaine$SEP$niveau$SEP$notionsn";

Si il y a un problème cela déclenche l'erreur :

Use of uninitialized value in concatenation (.) or string at
make_index_base.pl line xx


comment traiter ce cas pour qu'il m'indique sur quel numéro est le
problème...


Merci encore... ça va m'être très utile...
et en plus je suis désormais convaincu de passer à Perl... (j'avais
longtemps hésité entre Perl et Python... mais j'utilisais en attendant
GNU Bash)
Avatar
Nicolas George
"" wrote in message
<424ac498$0$3147$:
n'existe-t-il pas un moyen de faire quelque chose de portable (Linux et
Windows) pour gérer les répertoires ?


Le module File::Spec est fait pour ça, il me semble.

Avatar
Paul Gaborit
À (at) Wed, 30 Mar 2005 17:24:08 +0200,
"" écrivait (wrote):
wrote:

[]


# $file est un répertoire
if (! -e "$fileindex.txt") {
# '$fileindex.txt' existe
warn "'$fileindex.txt' n'existe pas : $!n" ;
next FILE;


j'ai quand même un problème avec ce morceau ("$fileindex.txt")
je suis sous Linux Debian
je pense que le problème viens des ou / dans les répertoires mais
n'existe-t-il pas un moyen de faire quelque chose de portable (Linux et
Windows) pour gérer les répertoires ?


Utilisez le slash (/) comme séparateur et ça marchera sur Windows comme sur
Unix. Il y a belle lurette que Windows (en fait sa bibliothèque C standard)
considère le slash (/) comme séparateur au même titre que le backslash ().

En revanche, si vous voulez être compatible Unix, Windows mais aussi MacOS,
VMS et autres OS, c'est plus sportif. Il faut utiliser un module spécialisé :
File::Spec (ou sa variante purement fonctionnelle File::Spec::Functions).

Tout cela est expliqué (entre autres) dans perlport.

--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>
Perl en français - <http://www.enstimac.fr/Perl/>


Avatar
noone
Avatar
noone
Avatar
noone

wrote:

[]


# $file est un répertoire
if (! -e "$fileindex.txt") {
# '$fileindex.txt' existe
warn "'$fileindex.txt' n'existe pas : $!n" ;
next FILE;



j'ai quand même un problème avec ce morceau ("$fileindex.txt")
je suis sous Linux Debian
je pense que le problème viens des ou / dans les répertoires mais
n'existe-t-il pas un moyen de faire quelque chose de portable (Linux et
Windows) pour gérer les répertoires ?

Merci


J'ai par contre un autre problème maintenant...

je lance mon script Perl depuis un Makefile

le problème c'est qu'il semble qu'il "plante en silence"


perl make_index_base.pl
make[2]: *** [index_base] Erreur 1


voici le Makefile


input=exercices

all:
$(MAKE) data
$(MAKE) latex
$(MAKE) xdvi

data:
$(MAKE) liste_exercices
$(MAKE) index_base

liste_exercices:
#./make_liste_exercices.sh
perl make_liste_exercices.pl

index_base:
perl make_index_base.pl

latex:
latex $(input).tex

xdvi:
xdvi $(input).dvi







et le script make_index_base.pl


#!perl -w

use strict;

#use vars qw($SEP
# $SEP_DIR
# );

our ($SEP, $SEP_DIR);

# sparateur : "t" ou ";" ou autre
$SEP="t;t";

$SEP_DIR="/"; #
#$SEP_DIR="";

open (OUT, ">index_table.txt")
or die "Ne peut pas ouvrir 'index_table.txt' : $!n";

my ($num) = "NUM";
my ($classe) = "CLASSE";
my ($domaine) = "DOMAINE";
my ($niveau) = "NIVEAU";
my ($notions) = "NOTIONS";

print OUT "$num$SEP$classe$SEP$domaine$SEP$niveau$SEP$notionsn";

FILE: foreach my $file (glob '*') {
if (-d $file) {
# $file est un rpertoire
if (! -e $file.$SEP_DIR."index.txt") { # "$fileindex.txt"
# '$fileindex.txt' existe
warn $file.$SEP_DIR."index.txt n'existe pas : $!n" ;
next FILE;
}
if (not open (F, "< $file".$SEP_DIR."index.txt")) {
# '$fileindex.txt' ne s'ouvre pas
warn "Ne peut pas ouvrir ".$file.$SEP_DIR."index.txt : $!n" ;
next FILE;
}
# '$fileindex.txt' est ouvert
my @all = <F>;
my $contents = join "n", @all;
close F;
# $contents contient toutes les lignes
# de l'index spare par 'n'
my ($num) = $file =~ /exo(d*)/;
my ($classe) = $contents =~ /%CLASSE=(.*)n/;
my ($domaine) = $contents =~ /%DOMAINE=(.*)n/;
my ($niveau) = $contents =~ /%NIVEAU=(.*)n/;
my ($notions) = $contents =~ /%NOTIONS=(.*)n/;
if (!defined($num)) {
# le dossier $file n'est pas nomm correctement
warn "Dossier '$file' mal nomm n" ;
next FILE;
}
print OUT "$num$SEP$classe$SEP$domaine$SEP$niveau$SEP$notionsn";
}
}
close OUT;
exit 1;





je ne sais pas ce qui fait planter le Makefile !


Si vous voyez merci de m'aider... (encore un peu...)





je donne quand même pour info le script make_liste_exercice.pl

use strict;

open (OUT, ">liste_exercices.tex")
or die "Ne peut pas ouvrir 'liste_exercices.tex' : $!n";

while(<exo*>)
{
print OUT <<LATEX_MODE;
begin{exercice} \
input{$_/exercice}
end{exercice}

LATEX_MODE
}




ainsi que mon fichier .tex

documentclass[a4paper,10pt]{article}

usepackage[frenchb]{babel} % specification francaise
usepackage[latin1]{inputenc} % entree clavier latin1
usepackage[T1]{fontenc} % sortie

% *---------------------------*
% *---- Compteur exercice ----*
% *---------------------------*
newcounter{num}
%renewcommand{thenum}{Roman{num}} % chiffres romains
renewcommand{thenum}{arabic{num}} % chiffres arabes
newcommand{exo}{addtocounter{num}{1}{noindent
textbf{Exercice~thenum~:~}}}
newenvironment{exercice}{exo}{vskip 0.5cm}


%opening
title{Physique}
author{moi}

begin{document}

maketitle

%begin{abstract}
%end{abstract}

%section{}

%begin{exercice}
%input{exo00001/exercice}
%end{exercice}

% Ajout automatique de tous les exercices
% lancer le script make_liste_exercices avant
% ========================================== input{liste_exercices}

end{document}




les exercices sont dans des répertoires exo0000x et contiennent
exercice.tex correction.tex et index.txt (pour générer la base)


Avatar
Régis Caspar
wrote:
j'ai quand même un problème avec ce morceau ("$fileindex.txt")
je suis sous Linux Debian
je pense que le problème viens des ou / dans les répertoires mais
n'existe-t-il pas un moyen de faire quelque chose de portable (Linux et
Windows) pour gérer les répertoires ?


Oooops j'ai lu un peu vite les posts sur f.c.t.t, désolé. D'autres
personnes ont répondus donc cf. leurs réponses ;)

--
Régis Caspar

1 2