Quel langage choisir pour traiter un fichier ? - Divers - Programmation
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.
Marsh Posté le 29-04-2014 à 14:38:51
Ok merci, malheureusement je n'ai que peu de connaissance en perl
Je pense je vais plus partir sur du php, pour communiquer avec une base de données directement y'a pas mieux
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+,
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
Marsh Posté le 29-04-2014 à 15:49:19
gilou a écrit : Pour faire ça, tu n'auras pas mieux que Perl. |
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).
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 : |
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+,
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...
|
Parfait, je te remercie gilou, ça me fait au moins une base pour me lancer dans le script
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...
|
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
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+,
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+,
Marsh Posté le 29-04-2014 à 16:31:23
gilou a écrit : |
Le fichier fait près de 15000L en fin de journée ..
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+,
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