1 File::Tabular Recherche et édition dans des fichiers tabulaires
LD, PJGE, juin 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
LD, PJGE, juin 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
LD, PJGE, juin Pas besoin d'un module Perl ! my $headerLine = ; chomp $headerLine; = split /\|/, $headerLine; foreach my $dataLine ( ) { chomp $dataLine; my %data; = split /\|/, $dataline; print $data{field1}, $data{fieldN};... }
LD, PJGE, juin Oui mais... u recherches multicritères u modifications u locks u journal u génération de clés
6 File::Tabular Recherches
LD, PJGE, juin API use File::Tabular; my $f = new File::Tabular($filename); my $row = $f->fetchrow; print $row->{field1}, $row->{field2};... $f->rewind;
LD, PJGE, juin API (suite) $row = $f->fetchrow(where=>'someWord'); $row = $f->fetchrow(where=> 'field1=4 AND field2>=" "'); $row = $f->fetchrow(where=> qr/some\s+(complex\s*)? (regex|regular\ expression)/xi);
LD, PJGE, juin API (suite) $rows = $f->fetchall(where => 'someField =~ ^[abc]+'); $rows = $f->fetchall(where => '+f1:someWord -f2:otherWord', orderBy => 'f1, f5:-alpha, f4:-d.m.y');
LD, PJGE, juin API (suite) $hashRows = $f->fetchall( where => 'foo AND NOT bar', key => 'someField' );
LD, PJGE, juin 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
LD, PJGE, juin 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 {.... }
LD, PJGE, juin compileFilter sub compileFilter { my $self = shift; my $q = shift; return eval "sub {my $r = shift;".. " and ".... } compilation du filtre closure sur $self
14 File::Tabular Édition principe : regrouper les entrées-sorties
LD, PJGE, juin 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);
LD, PJGE, juin 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
LD, PJGE, juin API (suite) $f->writeKeys({ key1 => {f1 => $v1, f2 => $v2,...}, key2 => undef,... ajout ou mise à jour suppression
LD, PJGE, juin 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.
LD, PJGE, juin Journal # on rejoue les mises à jour depuis # un fichier de backup my $bck = new File::Tabular("+<$backupFile"); $bck->playJournal($journalFile);