Ok, le premier objectif est de récupérer chaque champ; une des difficultés se trouve dans l'écriture de la pattern étant donné que certaine lignes se terminent avant le dernier champ (sans espaces pour combler).
Comme tu as dis dans ton premier post qu'il s'agissait de données espacées, il faut donc construire une pattern qui capture les champs et qui décrivent les espaces entre eux. À regarder le fichier example-data.txt, j'en ai déduit que les lignes avaient une longueur maximum de 110 caractères (sans compter le LF). Donc mon idée pour simplifier l'écriture de la pattern est de combler toute ligne de moins de 110 caractères avec des espaces. De cette manière, il n'est plus utile de vérifier si tel ou tel groupe existe en fin de ligne pour écrire la pattern.
Cette pattern est (si je ne me suis pas planté):
my $reg = qr/^(.{9}) {10}(.) (.{8}) (.{5}) {5}(.{8}) {9}(.{8}) (.{5}) {6}(.) (.{8}) {9}(.{8}) (.{5})/;
Ça fait donc 11 champs (donc 11 groupes de capture) séparés par un nombre variable d'espaces. Est-ce que tu confirmes ou est-ce que tu vois le découpage d'une autre manière (difficile de savoir si le A isolé fait partie du champ suivant ou si c'est un champ à part entière)?
Une fois raccord la dessus, la suite est relativement simple:
- On créé une chaîne formatée (pour sprintf) qui permet de justifier chaque placeholder.
- On passe en revue chaque champs pour voir ceux qui sont uniquement remplis d'espaces, puis dans ce cas on les remplace par #.
- Plus qu'à enregistrer la ligne générée avec les champs et la chaîne formatée dans le fichier de sortie.
Au passage, ça c'est un peu trop old school:
open (FIC,"<$fichier_in")
Désormais on utilise open avec 3 arguments et le filehandler est une vraie variable:
open(my $fhi, '<', $fichier_in)
Autre chose, démarre ton script avec: use strict;.
Perl 5.10 date de 2007, une petite mise à jour peut-être?
Partager