La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

1 File::Tabular Recherche et édition dans des fichiers tabulaires

Présentations similaires


Présentation au sujet: "1 File::Tabular Recherche et édition dans des fichiers tabulaires"— Transcription de la présentation:

1 1 File::Tabular Recherche et édition dans des fichiers tabulaires laurent.dami@justice.ge.ch

2 LD, PJGE, juin 20052 Fichier tabulaire champ1 | champ2 | champ3 v11 | v12 | v13 v21 | v22 | v23... ex.: /etc/passwd séparateur de champs noms de champs sur 1 ère ligne enregistrements sur lignes suivantes  CSV,"ce, ""format""",mal,fichu

3 LD, PJGE, juin 20053 Fichier tabulaire vs. SGBD u gratuit u portable, échangeable (Emacs, Excel,...) u aucune installation u recherches multi- champs, regex u lectures et recherches rapides MAIS u monotable u pas pour de très gros volumes u mises à jour lentes, locking global

4 LD, PJGE, juin 20054 Pas besoin d'un module Perl ! my $headerLine = ; chomp $headerLine; my @headers = split /\|/, $headerLine; foreach my $dataLine ( ) { chomp $dataLine; my %data; @data{@headers} = split /\|/, $dataline; print $data{field1}, $data{fieldN};... }

5 LD, PJGE, juin 20055 Oui mais... u recherches multicritères u modifications u locks u journal u génération de clés

6 6 File::Tabular Recherches

7 LD, PJGE, juin 20057 API use File::Tabular; my $f = new File::Tabular($filename); my $row = $f->fetchrow; print $row->{field1}, $row->{field2};... $f->rewind;

8 LD, PJGE, juin 20058 API (suite) $row = $f->fetchrow(where=>'someWord'); $row = $f->fetchrow(where=> 'field1=4 AND field2>="01.01.2001"'); $row = $f->fetchrow(where=> qr/some\s+(complex\s*)? (regex|regular\ expression)/xi);

9 LD, PJGE, juin 20059 API (suite) $rows = $f->fetchall(where => 'someField =~ ^[abc]+'); $rows = $f->fetchall(where => '+f1:someWord -f2:otherWord', orderBy => 'f1, f5:-alpha, f4:-d.m.y');

10 LD, PJGE, juin 200510 API (suite) $hashRows = $f->fetchall( where => 'foo AND NOT bar', key => 'someField' );

11 LD, PJGE, juin 200511 Search::QueryParser u préfixes + / - u AND, OR, NOT, (parenthèses) u champ:valeur u champ valeur txt : ( foo bar ) txt ~ "foo|bar" txt = foo OR txt = "bar" mot entier regex eq

12 LD, PJGE, juin 200512 Hash::Type u Pseudo-Hashes implémentation : arrays (économie RAM) fonction de comparaison $pType = new Hash::Type(qw(fname lname birth)); $cm = new $personType(qw(claudio monteverdi)); $cm->{birth} = 1567; $byAge = $pType->cmp("birth : -num, lname"); foreach (sort $byAge @composers) {.... }

13 LD, PJGE, juin 200513 compileFilter sub compileFilter { my $self = shift; my $q = shift; return eval "sub {my $r = shift;".. " and ".... } compilation du filtre closure sur $self

14 14 File::Tabular Édition principe : regrouper les entrées-sorties

15 LD, PJGE, juin 200515 API $f = new File::Tabular("+<$filename", {journal => ">>$journalFile"}); $f->append( {f1=>$v1, f2=>$v2,...}, {...},... ); my $hType = $f->ht; my $row = new $hType ($v1, $v2,...); $f->append($row);

16 LD, PJGE, juin 200516 API (suite) $f->splices( 4 => 2, undef, 7 => 1, {f1 => $v1, f2 => $v2,...}, 9 => 0, {...}, 22 => 0, [{...}, {...},...], -1 => 0, [{...}, {...},...] ); détruit 2 lignes remplace 1 ligne insère 1 ligne insère n lignes = append

17 LD, PJGE, juin 200517 API (suite) $f->writeKeys({ key1 => {f1 => $v1, f2 => $v2,...}, key2 => undef,... }, @keyFields); ajout ou mise à jour suppression

18 LD, PJGE, juin 200518 Implémentation des mises à jour u début du fichier intact u à partir de la première modif. : copie du reste du fichier sur fichier temporaire (File::Temp) merge entre les données de splice ou writeKeys et le reste du fichier Temp.

19 LD, PJGE, juin 200519 Journal # on rejoue les mises à jour depuis # un fichier de backup my $bck = new File::Tabular("+<$backupFile"); $bck->playJournal($journalFile);


Télécharger ppt "1 File::Tabular Recherche et édition dans des fichiers tabulaires"

Présentations similaires


Annonces Google