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

Fermé
KsPeR - 22 mars 2008 à 01:18
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 22 mars 2008 à 08:29
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 jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
22 mars 2008 à 08:29
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