Quel langage choisir pour traiter un fichier ?

Quel langage choisir pour traiter un fichier ? - Divers - Programmation

Marsh Posté le 29-04-2014 à 14:08:33    

Bonjour,
J'ai actuellement comme projet de remplir une base de données à partir de logs qui sont stockés dans un fichier de log.  
Je compte faire cela grâce a un script, quel langage me conseillez-vous (shell, php, perl, c,..) ?
 
On trouve une ligne par log avec un format bien spécifique, où "chaque colonne" est séparé par un espace :
-DATE X Y Z ...  
par exemple, et je voudrais pouvoir récupérer le X, le Y, le Z, comment pourrais-je procéder ? (dire que a chaque espace on a un attribut bien spécial..)
 
Voila, merci de votre aide :)

Reply

Marsh Posté le 29-04-2014 à 14:08:33   

Reply

Marsh Posté le 29-04-2014 à 14:35:42    

Si tu es courageux et fort en regexp, utilise perl, c'est fait pour.

 

Sinon python.


Message édité par Tangrim le 29-04-2014 à 14:36:01

---------------
Des Bisous et des nounours ! | Internet 2025 | Dungeon-Generator
Reply

Marsh Posté le 29-04-2014 à 14:38:51    

Ok merci, malheureusement je n'ai que peu de connaissance en perl :sweat:  
 
Je pense je vais plus partir sur du php, pour communiquer avec une base de données directement y'a pas mieux :)  

Reply

Marsh Posté le 29-04-2014 à 14:47:08    

Pour faire ça, tu n'auras pas mieux que Perl.
Explique un peu mieux ton problème et je te donnerai un coup de main.
(et je te rappelle que PHP est le fils bâtard de Perl et d'un serveur Apache... Pour communiquer avec une BDD, Perl a une flopée de modules DBI)
>> par exemple, et je voudrais pouvoir récupérer le X, le Y, le Z, comment pourrais-je procéder ? (dire que a chaque espace on a un attribut bien spécial..)  
En lecture ligne à ligne, tu vas faire un split de ta ligne lue sur le séparateur \s+ et récupérer les champs dans une liste que tu peux filtrer pour ne garder que les champs qui t’intéressent.
A+,

Message cité 1 fois
Message édité par gilou le 29-04-2014 à 14:54:35

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 29-04-2014 à 15:08:12    

Salut gilou,
 
Effectivement, plusieurs personnes me conseillent d'utiliser perl, bien que je n'ai que tres peu de connaissances dans ce langage..
Comme je l'ai dis, le fichier de log est parfaitement structuré, ainsi je veux par exemple récupérer un username, je sais que celui-ci ce trouvera obligatoirement sur la 6ème colonne! La solution que tu me proposes semble être la bonne, ça correspond à ce que je veux faire..  
 
Je pense me pencher un peu plus sur le perl jusqu'à la fin de la semaine pour attaquer mon script dès la semaine pro ..
 
Merci a toi pour ton aide :)

Reply

Marsh Posté le 29-04-2014 à 15:49:19    

gilou a écrit :

Pour faire ça, tu n'auras pas mieux que Perl.
Explique un peu mieux ton problème et je te donnerai un coup de main.
(et je te rappelle que PHP est le fils bâtard de Perl et d'un serveur Apache... Pour communiquer avec une BDD, Perl a une flopée de modules DBI)
>> par exemple, et je voudrais pouvoir récupérer le X, le Y, le Z, comment pourrais-je procéder ? (dire que a chaque espace on a un attribut bien spécial..)  
En lecture ligne à ligne, tu vas faire un split de ta ligne lue sur le séparateur \s+ et récupérer les champs dans une liste que tu peux filtrer pour ne garder que les champs qui t’intéressent.
A+,


Pour rappel, php fonctionne aussi en ligne de commande. Dans ce mode, il n'a pas grand chose à envier à Perl, j'imagine (je précise que je connais Perl comme ça en ayant vu des scripts, mais sans l'avoir pratiqué personnellement).


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 29-04-2014 à 16:00:17    

>> bien que je n'ai que tres peu de connaissances dans ce langage...
 
Si tu sais faire du PHP, tu ne devrais pas avoir trop de problèmes.
 
Dans ton cas, ça devrait ressembler à ceci:
 

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use autodie;
  5.  
  6. my $logfile = '/user/machin/mylog.txt';  # path de ton fichier de log
  7. open my $fh, "<", $logfile;
  8. while (<$fh> ) {
  9.    chop;
  10.    s/^\s+|\s+$//;
  11.    my @fields = split /\s+/;
  12.    # et on fait qque chose avec @fields
  13. }
  14. close $fh;


Et une des multiples docs sur l'emploi de DBI: http://oreilly.com/catalog/perldbi/chapter/ch04.html
@rufo, je connais pas assez PHP pour avoir un point de comparaison.
 
A+,

Message cité 2 fois
Message édité par gilou le 29-04-2014 à 16:09:21

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 29-04-2014 à 16:04:32    

gilou a écrit :

>> bien que je n'ai que tres peu de connaissances dans ce langage...
 
Si tu sais faire du PHP, tu ne devrais pas avoir trop de problèmes.
 
Dans ton cas, ça devrait ressembler à ceci:
 

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use autodie;
  5.  
  6. my $logfile = '/user/machin/mylog.txt';  # path de ton fichier de log
  7. open my $fh, "<", $logfile;
  8. while (<$fh> ) {
  9.    chop;
  10.    s/^\s+|\s+$//;
  11.    my @fields = split /\s+/;
  12.    # et on fait qque chose avec @fields
  13. }
  14. close $fh;


 
@rufo, je connais pas assez PHP pour avoir un point de comparaison.
 
A+,


 
Parfait, je te remercie gilou, ça me fait au moins une base pour me lancer dans le script :)  

Reply

Marsh Posté le 29-04-2014 à 16:11:45    

gilou a écrit :

>> bien que je n'ai que tres peu de connaissances dans ce langage...
 
Si tu sais faire du PHP, tu ne devrais pas avoir trop de problèmes.
 
Dans ton cas, ça devrait ressembler à ceci:
 

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use autodie;
  5.  
  6. my $logfile = '/user/machin/mylog.txt';  # path de ton fichier de log
  7. open my $fh, "<", $logfile;
  8. while (<$fh> ) {
  9.    chop;
  10.    s/^\s+|\s+$//;
  11.    my @fields = split /\s+/;
  12.    # et on fait qque chose avec @fields
  13. }
  14. close $fh;


 
@rufo, je connais pas assez PHP pour avoir un point de comparaison.
 
A+,


A la lecture de ton code, en PHP on aurait fait un file() pour lire le fichier et le mettre dans un tableau puis un foreach() pour parcourir chaque ligne. Sur chaque ligne, on aurait appliqué preg_split() pour découper la ligne via une regexp et mettre les éléments capturés dans un tableau.
 
Donc, on arriverait, en PHP, à un code ayant une structure très similaire à celle de Perl ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 29-04-2014 à 16:15:15    

Et je venais de rajouter ceci:
Et une des multiples docs sur l'emploi de DBI: http://oreilly.com/catalog/perldbi/chapter/ch04.html
 
D'autre part, pour mettre au point, ajoutes  
use Data:Dumper;
après le
use autodie;
 
et tu pourras faire
print Dumper(...);
pour imprimer à la console la valeur d'une variable, par exemple un  
print Dumper(@fields);
te donnera le contenu de la liste @fields.
 
Si tu es dans un environnement Windows, l'emploi du perl d'ActiveState (version gratuite free community edition) est plutôt recommandé, et dans un environnement linux, Perl devrait être intégré aux distributions.
 
A+,


Message édité par gilou le 29-04-2014 à 16:20:51

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 29-04-2014 à 16:15:15   

Reply

Marsh Posté le 29-04-2014 à 16:19:42    

rufo a écrit :

Donc, on arriverait, en PHP, à un code ayant une structure très similaire à celle de Perl ;)

Ce qui est normal, puisque les concepteurs de PHP sont parti de Perl et Apache pour faire qque chose de mieux intégré. En général (sauf emploi de nouveautés pointues de perl) on peut transcrire un script basique de l'un à l'autre langage sans trop de pbs.
 
J'aurais pu aussi faire un foreach (qui lit tout dans une liste en mémoire) en perl:
...
foreach (<$fh> ) {
   chop;
   s/^\s+|\s+$//;
   my @fields = split /\s+/;
   # et on fait qque chose avec @fields
}
...
mais pour un fichier de log dont j'ignore la taille, je préfère faire un while qui fait une lecture ligne à ligne.
 
A+,

Message cité 1 fois
Message édité par gilou le 29-04-2014 à 16:28:06

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 29-04-2014 à 16:31:23    

gilou a écrit :


mais pour un fichier de log dont j'ignore la taille, je préfère faire un while qui fait une lecture ligne à ligne.


 
Le fichier fait près de 15000L en fin de journée .. :o

Reply

Marsh Posté le 29-04-2014 à 16:37:00    

C'est la taille en mémoire qui va compter, donc multiplier le nb de lignes par la taille d'une ligne.
Si c'est négligeable pour la mémoire de la machine qui exécute le script, un foreach sera plus rapide (lecture d'un coup) qu'un while (lecture ligne à ligne).
Bref selon que la rapidité d’exécution ou l'efficacité en occupation mémoire est favorisé, on choisit l'une ou l'autre solution.
 
Après, si tu sais quel champs tu veux garder dans ton résultat, tu pourras les filtrer dès le départ:
si je remplace my @fields = split /\s+/; par my @fields = (split /\s+/)[1,3]; je ne garde que les 2e et 4e champs dans @fields
 
A+,


Message édité par gilou le 29-04-2014 à 16:45:34

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed