Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1404 connectés 

  FORUM HardWare.fr
  Programmation
  Divers

  Quel langage choisir pour traiter un fichier ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Quel langage choisir pour traiter un fichier ?

n°2226485
ifr38
Posté le 29-04-2014 à 14:08:33  profilanswer
 

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 :)

mood
Publicité
Posté le 29-04-2014 à 14:08:33  profilanswer
 

n°2226497
Tangrim
Des bisous et des nounours !
Posté le 29-04-2014 à 14:35:42  profilanswer
 

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
n°2226498
ifr38
Posté le 29-04-2014 à 14:38:51  profilanswer
 

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 :)  

n°2226503
gilou
Modérateur
Modzilla
Posté le 29-04-2014 à 14:47:08  profilanswer
 

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é!  --
n°2226515
ifr38
Posté le 29-04-2014 à 15:08:12  profilanswer
 

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 :)

n°2226550
rufo
Pas me confondre avec Lycos!
Posté le 29-04-2014 à 15:49:19  profilanswer
 

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
n°2226568
gilou
Modérateur
Modzilla
Posté le 29-04-2014 à 16:00:17  profilanswer
 

>> 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é!  --
n°2226571
ifr38
Posté le 29-04-2014 à 16:04:32  profilanswer
 

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 :)  

n°2226575
rufo
Pas me confondre avec Lycos!
Posté le 29-04-2014 à 16:11:45  profilanswer
 

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
n°2226577
gilou
Modérateur
Modzilla
Posté le 29-04-2014 à 16:15:15  profilanswer
 

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é!  --
mood
Publicité
Posté le 29-04-2014 à 16:15:15  profilanswer
 

n°2226578
gilou
Modérateur
Modzilla
Posté le 29-04-2014 à 16:19:42  profilanswer
 

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é!  --
n°2226585
ifr38
Posté le 29-04-2014 à 16:31:23  profilanswer
 

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

n°2226588
gilou
Modérateur
Modzilla
Posté le 29-04-2014 à 16:37:00  profilanswer
 

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é!  --

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Divers

  Quel langage choisir pour traiter un fichier ?

 

Sujets relatifs
Mon fichier traitement.php ne fonctionne paslangage c++
Validation de fichier de conf en python[RESOLU][powershell 2.0] Lecture de fichier properties problématique..
supprimer cote dans un fichierVBA EXCEL Choisir la boite mail d'envoi lors d'un envoi via Outlook
Fonction include pour un fichier htmlCouper des champs particuliers du fichier texte
parser un fichier json avec jqueryimportation de valeur de cellule dans un texte sous excel
Plus de sujets relatifs à : Quel langage choisir pour traiter un fichier ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR