Après lecture du fichier que tu m'as fourni en privé, le problème est plus complexe qu'il n'y parait : les retours à la ligne ne se trouvent pas dans les cellules, mais plutôt, un peu n'importe où. Autant les trois premières lignes (séparées par \n\r) ne contiennent effectivement que 40 cellules séparées d'un ; (+ un ; en fin de ligne), autant par la suite, c'est plus chaotique, et la ligne suivante contient bien plus de cellules.
Cependant, les retours à la lignes semble ne pas être significatifs.
Pour lire correctement votre fichier, voici une proposition :
1 2 3 4 5 6
| $/ = ";"; # definit le séparateur de ligne à ;
while (!eof STDIN) {
# chaque ligne est constituée de 41 cellules séparées par des ;
# (41 car il semble qu'il y ait un ; à la fin de la dernière cellule d'une ligne)
push @ligne, [ map { scalar(<STDIN>) } 0 .. 40 ];
} |
Ceci dit, cela à deux inconvénients :
- les cellules peuvent contenir des \n. Dans ce cas, on peut les supprimer en modifiant le map :
push @ligne, [ map { (my $cell = <STDIN>) =~ s/[\n\r]//g; $cell } 0 .. 40 ];
- à partir de la ligne 40 (identifiant 139), il semble qu'il y ait un décalage, et que la ligne précédente possède plus de cellules (42 cellules, donc 43 points-virgules).
J'ai par ailleurs compté au total 1729 lignes de 40 cellules (donc 70889 points-virgules).
Partager