Aide sur perl
débutant
-
ligoo -
ligoo -
je commence a apprendre le language PERL et j'aimerais m'aider a pourvoir lire le contenu d un fichier .txt et de le stocker dans une base de données access.
la structur du fichier txt et le suivant ( contient des répititions):
10/08/06*05:05:47*minor*snmpSystemId=MT2FE7B/alarmEntryId=7400*DEVICE=board:0,liu:2
10/08/06*05:05:47*minor*snmpSystemId=MT2FE2B/alarmEntryId=2510*DEVICE=board:0,liu:3
10/08/06*05:15:47*critical*snmpSystemId=MT2FE2B/alarmEntryId=2511*DEVICE=board:0,liu:4
10/08/06*05:25:47*warning*snmpSystemId=MT2FE7B/alarmEntryId=7401*DEVICE=board:0,liu:3
10/08/06*05:35:47*major*snmpSystemId=MT2FE2B/alarmEntryId=2511*DEVICE=board:0,liu:5
et je veux le resultats sous form d'un tableau comme suit (sans repitition):
10/08/06 05:05:47 minor MT2FE7B DEVICE=board:0,liu:2
10/08/06 05:15:47 critical MT2FE2B DEVICE=board:0,liu:4
10/08/06 05:25:47 warning MT2FE7B DEVICE=board:0,liu:3
10/08/06 05:35:47 major MT2FE2B DEVICE=board:0,liu:5
Merci pour votre aide.
la structur du fichier txt et le suivant ( contient des répititions):
10/08/06*05:05:47*minor*snmpSystemId=MT2FE7B/alarmEntryId=7400*DEVICE=board:0,liu:2
10/08/06*05:05:47*minor*snmpSystemId=MT2FE2B/alarmEntryId=2510*DEVICE=board:0,liu:3
10/08/06*05:15:47*critical*snmpSystemId=MT2FE2B/alarmEntryId=2511*DEVICE=board:0,liu:4
10/08/06*05:25:47*warning*snmpSystemId=MT2FE7B/alarmEntryId=7401*DEVICE=board:0,liu:3
10/08/06*05:35:47*major*snmpSystemId=MT2FE2B/alarmEntryId=2511*DEVICE=board:0,liu:5
et je veux le resultats sous form d'un tableau comme suit (sans repitition):
10/08/06 05:05:47 minor MT2FE7B DEVICE=board:0,liu:2
10/08/06 05:15:47 critical MT2FE2B DEVICE=board:0,liu:4
10/08/06 05:25:47 warning MT2FE7B DEVICE=board:0,liu:3
10/08/06 05:35:47 major MT2FE2B DEVICE=board:0,liu:5
Merci pour votre aide.
15 réponses
-
Salut,
si tu n'as pas la solution jusqu'à ce soir, je vais essayer de t'aider.
et je veux le resultats sous form d'un tableau comme suit (sans repitition):
10/08/06 05:05:47 minor MT2FE7B DEVICE=board:0,liu:2
Pas claire ça.
Tu veux qui exactement?
Un champ date, un champ heure, ..
Et si je compte bien il s'agit de 5 champs.
lami20j -
merci Lami20j
en fait il s'agit d'une table d'access qui contient les champs suivants:
date heure severité système carte
je porte a votre connaissance que le fichier source contient des lignes ki s repete et je vx les suprimer dans le fichier résultant -
Re,
en fait pour importer un fichier texte dans une base access, je suppose que les champs (dans le fichier texte) doivent être separées par un espace ou tabulation (ça je ne sais pas).
En ce qui concerne l'élimination des lignes en double, triple,... ça ne pose pas un problème.
Mets ton fichier sur https://www.cjoint.com/ et je verai ce soir.
lami20j -
les champs dans le fichier texte sont separées par un etoile (*)
just une remarque j'ai deja crée un programme qui permet de faire ce type de traitement mé c tres long....
use DBI;
open (F,"test.txt") || die "$!";
my @data= <F>;
close (F);
my $base='D:\syteme\base.mdb';
my $dbh=DBI->connect("dbi:ADO:Driver=Microsoft Access Driver (*.mdb); DBQ=$base","","") or die $DBI::errstr;
foreach $line (@data)
{
chomp($line);
if ($line=~/^(\d{2}\/\d{2}\/\d{2})\*(\d{2}\:\d{2}\:\d{2})\*(\w+)\*snmpSystemId\=(\w+).*\*(.*)\*(.*)/)
{
#print "$1\t$2\t$3\t$4\t$5\t$6\n";
my $Command1= "delete from test where (Date='$1' and heure='$2' and severite='$3' and systeme='$4' and carte='$5')";
my $sth1= $dbh->prepare($Command1);
my $Result1 = $sth1->execute;
$dbh->do("INSERT INTO `test` (Date,heure,severité,systeme,carte) VALUES ('$1','$2','$3','$4','$5')");
}
}
print "fin \n";
<>; -
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
Salut,
voilà comment tu peux obtenir tes variables.
A adapter à ton code.
Si tu n'arrives pas à adapter à ton code fait un signe.#!/usr/bin/perl use warnings;use strict; open F_LIRE,"test.txt" # ouvre le test.txt en lecture or die "E/S : $!\n"; # msg si erreur d'ouverture my %h; # pour les lignes en double, triple... while ( <F_LIRE> ) { # lis le fichier ligne par ligne chomp; # supprime le caractère de fin de ligne next if /^\s*$/; # ne traite pas les lignes vides s/snmp.*?=|\/alarm.*(?=\*device)//gi; # suppression de texte au tour de # de texte MT.... $h{$_}++; # stockage dans un hash # elimine lignes en double, triple.. # mieux que d'utiliser un tableau # qui stocke tout le fichier # y compris les doublons, triplons # on consomme moins de mémoire. } foreach (keys %h) { my ($d,$h,$sev,$sys,$book) = split /\*/,$_; # j'obtiens les variables # nécessaires pour INSERT INTO print "$d : $h : $sev : $sys : $book\n"; # affiche le contenu de # variables # seulement pour montrer leur # contenu. # A adapter dans ton code } __END__ Tu ce que tu vois après __END__ n'est pas lu par le script Les commentaires commence avec le # Pense à ceux qui lisent ton code. Et aussi à toi pour la maintenance. Il faut respecter quelque règles de base - l'identation par exemple Ex: - en Perl pour le bloc if on préfère écrire if ( condition ) { instructions; } Quand on ne connaît pas la précédence des opérateurs on utilise les paranthèses. Cependant l'utilisation en trop ce n'est pas top. Ex: Tu as écrit open (F,"test.txt) || die "$!"; si on utilise l'opérateur or qui à la précédence la plus faible on n'est pas obligé d'utiliser les paranthèses. Et le code devient open F,"test.txt or die "$!"; C'est comme tu dit dans le langage normal Ouvre le fichier en lecture ou meurs.(Aproche de langage qu'on parle).lami20j -
Merci infiniment Lami;
je vé essayer de faire tous les tests et je te fé signe de résultats.
merci -
le programme marche trés bien mé g trouvé klk anomalies concernant le dernier champs dans le fichier source .
le dernier champs peut commencer par DEVICE comme il pt commencer par d'autre chaine de caractère.
Merci d'avance. -
Salut,
mé g trouvé klk anomalies concernant le dernier champs dans le fichier source .
le dernier champs peut commencer par DEVICE comme il pt commencer par d'autre chaine de caractère.
Je me confronte souvent avec ce problème.
Quand on parse un fichier c'est bien de connaître la structure de fichier. Dans toutes les lignes que tu m'as donnée je ne vois que DEVICE.
Donc pour la prochaine fois il faut préciser.
Change la lignes/snmp.*?=|\/alarm.*(?=\*device)//gi;
avecs/snmp.*?=|\/alarm.*(?=\*.*=)//gi;
lami20j -
G deja fé cette operation de remplacer DEVICE par ".*=" mé ca donne l'erreur suivant:
Use of uninitialized value in concatenation (.) or string at D:\test\test.pl line 26 ,<F_LIRE> line 12.
Merci pour votre collaboration -
Salut,
je pense que c'est le moment de m'afficher le fichier que tu traites.
Tu peux mettre ton fichier sur https://www.cjoint.com/
Ce que tu vois c'est un message d'avertissement, pas forcement une interruption du script.
Comme je te l'ai déjà dit si je ne connais pas la structure de fichier je ne peux pas faire grand chose. Je suis totalement aveugle.
Ce que je te donnes se base sur les quelques lignes que tu m'as données.
lami20j -
Re ;
pr recapitulation voici un extrait du fichier traité:
----------
07/04/06*09:03:12*indeterminate*snmpSystemId=MT2FE5B/privateId=MT2FE5B/alarmsId=MT2FE5B/alarmObjectsId=MT2FE5B/alarmEntryId=24353*Could not attach voice resource. *Unspecified application alarm.
07/04/06*09:03:12*indeterminate*snmpSystemId=MT2FE5B/privateId=MT2FE5B/alarmsId=MT2FE5B/alarmObjectsId=MT2FE5B/alarmEntryId=24353*Could not attach voice resource. *Unspecified application alarm.
07/04/06*09:30:04*minor*snmpSystemId=MT2FE7B/privateId=MT2FE7B/alarmsId=MT2FE7B/alarmObjectsId=MT2FE7B/alarmEntryId=13420*Can not hangup, resource still attached*Unspecified minor alarm in the LI_
07/04/06*09:30:04*minor*snmpSystemId=MT2FE7B/privateId=MT2FE7B/alarmsId=MT2FE7B/alarmObjectsId=MT2FE7B/alarmEntryId=13420*Can not hangup, resource still attached*Unspecified minor alarm in the LI_
07/04/06*09:30:08*minor*snmpSystemId=MT2FE7B/privateId=MT2FE7B/alarmsId=MT2FE7B/alarmObjectsId=MT2FE7B/alarmEntryId=13421*Can not hangup, resource still attached*Unspecified minor alarm in the LI_
07/04/06*09:30:08*minor*snmpSystemId=MT2FE7B/privateId=MT2FE7B/alarmsId=MT2FE7B/alarmObjectsId=MT2FE7B/alarmEntryId=13421*Can not hangup, resource still attached*Unspecified minor alarm in the LI_
07/04/06*09:30:11*minor*snmpSystemId=MT2FE7B/privateId=MT2FE7B/alarmsId=MT2FE7B/alarmObjectsId=MT2FE7B/alarmEntryId=13422*Can not hangup, resource still attached*Unspecified minor alarm in the LI_
07/04/06*09:30:11*minor*snmpSystemId=MT2FE7B/privateId=MT2FE7B/alarmsId=MT2FE7B/alarmObjectsId=MT2FE7B/alarmEntryId=13422*Can not hangup, resource still attached*Unspecified minor alarm in the LI_
07/04/06*09:30:29*minor*snmpSystemId=MT2FE7B/privateId=MT2FE7B/alarmsId=MT2FE7B/alarmObjectsId=MT2FE7B/alarmEntryId=13428*Can not hangup, resource still attached*Unspecified minor alarm in the LI_
07/05/06*07:47:08*minor*snmpSystemId=MT2FE2B/privateId=MT2FE2B/alarmsId=MT2FE2B/alarmObjectsId=MT2FE2B/alarmEntryId=9323*DEVICE=board:0,liu:6 ERRORNUM=105 ALARMCODE=1 ERRORTXT=Frame Slip*Frame Slip.
07/05/06*07:47:08*minor*snmpSystemId=MT2FE2B/privateId=MT2FE2B/alarmsId=MT2FE2B/alarmObjectsId=MT2FE2B/alarmEntryId=9323*DEVICE=board:0,liu:6 ERRORNUM=105 ALARMCODE=1 ERRORTXT=Frame Slip*Frame Slip.
----------
et le programme modefié est le suivant :
------
#!/usr/bin/perl
use warnings;use strict;
open F_LIRE,"test5.txt"
or die "E/S : $!\n";
my %h;
while ( <F_LIRE> ) {
chomp;
next if /^\s*$/;
s/snmp.*?=|\/pri.*(?=\*.*=)//gi;
$h{$_}++;
}
foreach (keys %h) {
my ($d,$h,$sev,$sys,$book,$f) = split /\*/,$_;
print "$d : $h : $sev : $sys : $book : $f\n";
}
<>;
---------
normalement je dois voir le résultat comme suit:
07/04/06 : 09:03:12 : indeterminate : MT2FE5B : Could not attach voice resource. : Unspecified application alarm.
07/05/06 : 07:47:08 : minor : MT2FE2B : DEVICE=board:0,liu:6 ERRORNUM=105 ALARMCODE=1 ERRORTXT=Frame Slip : Frame Slip.
07/04/06 : 09:30:29 : minor : MT2FE7B : Can not hangup, resource still attached : Unspecified minor alarm in the LI_
07/04/06 : 09:30:11 : minor : MT2FE7B : Can not hangup, resource still attached : Unspecified minor alarm in the LI_
07/04/06 : 09:03:12 : indeterminate : MT2FE5B : Could not attach voice resource. : Unspecified application alarm.
07/04/06 : 09:30:04 : minor : MT2FE7B : Can not hangup, resource still attached : Unspecified minor alarm in the LI_
07/04/06 : 09:30:08 : minor : MT2FE7B : Can not hangup, resource still attached : Unspecified minor alarm in the LI_
----
thx again -
Re,
je vois pourquoi. je te dirai ce soir. je suis au boulot.
as-tu donner toutes les possibilités?
Could not
Can not
DEVICE
lami20j -
malhereusement oui,
ya d'autre possibilité car le fichier source est le résultat des trap SNMP :(
Merci. -
Salut,
c'est normal que le script n'affiche pas ce que tu veux.
Quand on fait split en utilisant le séparateur l'étoile *, vu que tu as une étoile aussi avant
*Unspecified application alarm. on ne stocke pas ce qu'on trouve après la dernière étoile.
Donc il nous faut une variable de plus. En gras tu as les modifications#!/usr/bin/perl use warnings;use strict; open F_LIRE,"test.txt" or die "E/S : $!\n"; my %h; while ( <F_LIRE> ) { chomp; next if /^\s*$/; s/snmp.*?=|\/pri.*(?=\d+\*)//gi; $h{$_}++; } foreach (keys %h) { my ($d,$h,$sev,$sys,$book,$book2) = split /\*/,$_; print "$d : $h : $sev : $sys : $book : $book2\n"; } __END__lami20j -
Ok pour le programme .
je vé essayer d'ajouter des ligne pour inserer les données ds la base de données access et je vais vs tenir au courant si ya des probleme ;).
Merci encors pr votre aide.
a+