Rechercher : dans
Par :

[perl] extraire le texte d'une ligne

Dernière réponse le 2 fév 2008 à 16:06:08 trepliev, le 31 jan 2008 à 18:29:44 
 Signaler ce message aux modérateurs

Bonjour,

Je cherche à faire un script qui parse un fichier ligne par ligne et qui, à partir d'une certaine position dans la ligne, extrait le contenu de la ligne pour le mettre dans un autre fichier.

Par exemple, j'ai un fichier qui contient les lignes suivantes:

bla yopyo ahah
pofpofpof pifpif

Je veux qu'à partir de la position (colonne ?) 12, le reste de la ligne soit extraite dans un autre fichier, c'est à dire à partir du a de "ahah" et du p de "pifpif" (les espaces devant compter comme une position).

J'ai réussi à parser le fichier et à extraire son contenu dans un autre, mais je ne sais pas comment gérer cette histoire de position.
J'ai vu des fonctions du genre substr, index, unpack...mais rien qui puisse faire l'affaire.

Une idée ?

Merci d'avance,

Trepliev

Configuration: Linux
Firefox 2.0.0.11

Meilleures réponses pour « [perl] extraire le texte d'une ligne » dans :
Comment lire un fichier ligne par ligne VoirComment lire un fichier ligne par ligne Préambule Boucle while Syntaxe Exemple Astuces Bonus Boucle for Syntaxe Préambule Une des erreurs les plus communes dans l'apprentissage des scripts "bash" sous GNU/LInux pour lire un fichier...
Syntaxe de la ligne de commande NT/XP VoirSyntaxe de la ligne de commande NT/XP Voici une page web décrivant la syntaxe de la ligne de commande de Windows NT/2000/XP/2003 (cmd.exe). On y retrouve comment faire des boucles, découper des chaînes de caractères, manipuler les dates, utiliser...
Linux - L'éditeur Vi VoirIntroduction à Vi Vi est un des éditeurs de texte les plus populaires sous les systèmes de type Unix (avec Emacs et pico) malgré son ergonomie très limitée. Sous Linux il existe une version libre de Vi appelée Vim (Vi Improved). Vi (prononcez...

1

jipicy, le 31 jan 2008 à 19:27:48

Salut,

Et avec "sed" ça te branche pas ?

[tmpfs]$ cat trepliev
bla yopyo ahah
pofpofpof pifpif

[tmpfs]$ sed -n 's/^.\{10\}\(.*\)/\1/w fich.out' trepliev

[tmpfs]$ cat fich.out
ahah
pifpif
;-))

Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

2

trepliev, le 31 jan 2008 à 20:05:09

Salut et merci pour ta réponse,

Effectivement ça donne le résultat attendu (pourrais-tu d'ailleurs détailler un peu la commande ?)
Le problème c'est que je vais avoir ensuite d'autres traitements sur cette extraction, avec des conditions en fonction de la présence d'un caractère précis à telle ou telle position....c'est pour ça que j'étais parti sur du perl.

Trepliev

Répondre à trepliev

4

jipicy, le 31 jan 2008 à 20:34:26

-n : demande de ne pas afficher le résultat sur la sortie standard (l'écran)

s : commande de substitution

/ : délimiteur de la commande "s"

^.\{10\}\(.*\) : l'expression rationnelle décomposée comme suit :

^.\{10\} : les 10 premiers caractère (symbolisés par le point ".") depuis le début (^) de la ligne. (Les accolades doivent être protégées (\{ et \}) pour ne pas être interprétées littéralement)

\(.*\) : la sous-expression (entre parenthèses protégées elles aussi pour ne pas être interprétées littéralement) qui matche du 11ème caractère à la fin

/ : délimiteur de la commande "s"

\1 : la référence à la sous-expression (si plusieurs, les références se font par /2 /3 /4 etc. jusqu'à 9).

/ : délimiteur de fin de la commande "s"

w fich.out : le switch "w" (pur write) qui demande l'écriture de la sous-expression dans le fichier de sortie

En résumé : dans la commande de substitution, on demande à récupérer ce qui est matchée par la sous-expression et de l'envoyer dans un fichier de sortie

;-))
Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

5

trepliev, le 2 fév 2008 à 15:46:18
  • +2

Ello,

Pour ceux que ça intéresse, j'ai trouvé comment faire ça en perl sans regexp et également avec une commande bash.

En perl:

#! /usr/bin/perl

while ($string = <>) { # lecture ligne par ligne du fichier passé en paramètre
$extract = substr( $string, 4, 15 );  # extraie le texte à partir du caractère 5 sur les 15 prochains caractères
print "$extract\n";
}

En bash, on peut utiliser la commande colrm
Par exemple:
colrm 5 15 < test > result
va supprimer les caractères de 5 à 15 inclus de test et afficher le reste dans result

En espérant que ça puisse aider ;)

Trepliev

Répondre à trepliev

6

 jipicy, le 2 fév 2008 à 16:06:08

Merci ;-))

Mais on peut aussi faire comme ça :

$ cat plop
bla yopyo ahah
pofpofpof pifpif

$ while read line; do echo ${line:10}; done < plop
ahah
pifpif
et si tu ne veux 3 caractères à partir du 10ème, il suffit de rajouter :
$ while read line; do echo ${line:10:3}; done < plop
aha
pif
;-))

Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy
Collection CommentÇaMarche.net