Pour parser des données formattées comme suit:
numero1;prov1;dest1;prot1a;prot1b
numero2;prov2;dest2;dest2a;prot2b
numero3;prov3;dest3;prot3
numero4;prov4;dest4;prot4a;prot4b;prot4c;prot4d
numero5;prov5;dest5;prot5
numero6;prov6;dest6;prot6 |
j'utiliserais ceci:
Code :
#!/usr/bin/perl use strict; use warnings; use Text::CSV; my $sep = ';'; my $csv = new Text::CSV({sep_char => $sep}); my @f; while (<> ) { if($csv->parse($_)) { @f = $csv->fields(); } } }
|
a la ligne 7, je crée un nouveau parser au format CSV
a la ligne 9, je récupère stdin ligne a ligne
a la ligne 10 et 11: une ligne est parsée et ses champs sont rangés dans un array
a la ligne 12 et 13: s'il y a plus de trois champs, je crée un sous-array qui démarre a partir du 4e champ, je concatène les 3 premiers champs de l'ancien array a chaque champ du sous-array, et j'imprime chaque champ ainsi modifié ligne à ligne.
Pour la ligne en entrée numero1;prov1;dest1;prot1a;prot1b
après parsing, @f est un array a 5 éléments (numero1, prov1, dest1, prot1a, prot1b)
@f[3..scalar(@f)-1]) vaut donc (prot1a, prot1b)
$f[0].$sep.$f[1].$sep.$f[2].$sep vaut "numero1;prov1;dest1;"
map {$f[0].$sep.$f[1].$sep.$f[2].$sep.$_} @f[3..scalar(@f)-1] transforme donc
(prot1a, prot1b) en (numero1;prov1;dest1;prot1a, numero1;prov1;dest1;prot1b) et il ne reste plus qu'a imprimer chaque élément de cet array comme une ligne, par du code standard (print join '\n',...).
A+,
Message édité par gilou le 11-09-2009 à 16:27:25
---------------
There's more than what can be linked! -- Iyashikei Anime Forever! -- AngularJS c'est un framework d'engulé! --