Aide sur perl

Fermé
débutant - 13 oct. 2006 à 13:04
 ligoo - 18 oct. 2006 à 12:37
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.
A voir également:

15 réponses

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
13 oct. 2006 à 13:25
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
0
ligo7 Messages postés 3 Date d'inscription mardi 1 avril 2003 Statut Membre Dernière intervention 16 octobre 2006
13 oct. 2006 à 13:53
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
0
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
13 oct. 2006 à 14:27
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
0
ligo7 Messages postés 3 Date d'inscription mardi 1 avril 2003 Statut Membre Dernière intervention 16 octobre 2006
13 oct. 2006 à 15:26
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";

<>;
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
14 oct. 2006 à 10:21
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
0
Merci infiniment Lami;
je vé essayer de faire tous les tests et je te fé signe de résultats.
merci
0
ligo7 Messages postés 3 Date d'inscription mardi 1 avril 2003 Statut Membre Dernière intervention 16 octobre 2006
16 oct. 2006 à 15:00
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.
0
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
16 oct. 2006 à 18:46
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 ligne
s/snmp.*?=|\/alarm.*(?=\*device)//gi;
avec
s/snmp.*?=|\/alarm.*(?=\*.*=)//gi;
lami20j
0
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
0
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
17 oct. 2006 à 12:16
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
0
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
0
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
17 oct. 2006 à 13:03
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
0
malhereusement oui,
ya d'autre possibilité car le fichier source est le résultat des trap SNMP :(
Merci.
0
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
17 oct. 2006 à 19:37
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
0
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+
0