[PERL] extraction de données d'un fichier txt

KsPeR -  
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   -
Bonjour,

Je dois faire un travail d'extraction de données a partir de fichiers texte (toujours la même chose en fait). mais devant la grande quantité de fichiers a traiter j'aimerais bien essayé d'automatiser cela.

On m'a conseillé le perl pour ce type de script. Je n'ai jamais touché à ce langage. et je ne sais pas si c'est vraiment réalisable.

Voici le genre de fichier que j'ai entrée :

nom A 2 12 34
nom B 4 56 78 78 9
nom C 3 34 9 12
nom D 1 12
...etc

et voici ce que j'aimerais obtenir en fichier de sortie :

graph G {
"nom A" -- "nom C" [label="12"];
"nom A" -- "nom C" [label="34"];
"nom A" -- "nom B" [label="34"];
"nom A" -- "nom D" [label="12"];

"nom B" -- "nom C" [label="9"];

"nom C" -- "nom D" [label="12"];


etc ...

Le but en fait est de mettre en évidence les relation qu'il existe entre les différents "nom" (A, B C etc...).
Le fichier de sortie permet de générer une sorte de graphe qui représente ces différentes relations.

Je ne pense pas qu'il soit possible d'obtenir directement un tel fichier de sortie structuré. Mais j'aimerais faire le minimum de "retouche" à la main en fait, car il y a vraiment beaucoup de fichier a traiter.

Voila si quelqu'un a une idée, ou a déja réaliser ce genre de script, n'hésiter pas !

Merci,

Boinne journée
A voir également:

1 réponse

lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Salut,

tu ne devrais pas avoir ça

"nom A" -- "nom B" [label="34"];

si j'ai bien compris pour chaque combaison tu dois avoir les éléments communs comma label
dans B tu n'as pas 34
voici ce que ça donne
#!/usr/bin/perl
use strict;use warnings;
my (@g,%h);

while(<DATA>){
  my ($c,$v,@tmp,@unique,%vu);
  ($c,$v) = $_ =~ /^(nom\s*[A-Z])\s*(.*)/;
  @tmp    = split /\s+/,$v;
  @unique = grep { !$vu{$_}++ } @tmp;
  push @{$h{$c}},@unique;
}

@g=sort keys %h;
print "graph G {\n";

while (@g){
  my ($e,$k,$x,$z,%intersect,%union);
  $k = shift @g;
  for(@g){
    for $x(@{$h{$k}},@{$h{$_}}) { $union{$x}++ && $intersect{$x}++ };
    my @val = sort keys %intersect;
    for $z(@val){print "    \"$k\"-\"$_\" [label=\"$z\"];\n" if $z};
    for $e(keys %union)    {delete $union{$e}};
    for $e(keys %intersect){delete $intersect{$e}};
  }
}
print "};\n";
__END__
nom A 2 12 34
nom B 4 56 78 78 9
nom C 3 34 9 12
nom D 1 12
et le résultat de l'exécution
lami20j@debian:~/trash$ perl graph.pl
graph G {
    "nom A"-"nom C" [label="12"];
    "nom A"-"nom C" [label="34"];
    "nom A"-"nom D" [label="12"];
    "nom B"-"nom C" [label="9"];
    "nom C"-"nom D" [label="12"];
};
lami20j@debian:~/trash$


Par exemple si je met un 34 au lieu de 4 pour B j'obtiens
lami20j@debian:~/trash$ perl graph.pl
graph G {
    "nom A"-"nom B" [label="34"];
    "nom A"-"nom C" [label="12"];
    "nom A"-"nom C" [label="34"];
    "nom A"-"nom D" [label="12"];
    "nom B"-"nom C" [label="34"];
    "nom B"-"nom C" [label="9"];
    "nom C"-"nom D" [label="12"];
};

0