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

[Fermé]
Signaler
-
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
-
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

1 réponse

Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 545
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"];
};