titof92
2011-12-21 21:39:24 UTC
Bonjour,
J'ai un fichier de donnée au format CSV (avec des caractères ; en
guise de séparateurs de valeurs) que je lis en séquentiel. En fait, je
voudrais remplacer le code dossier a figurant en 2e élément dans
l'extrait ci-dessous par le code dossier b, disponible dans ma table
de hachage d'une part, remplacer les dates apparaissant sur chaque en
ligne, en changeant le format pour qu'elles apparaissent en format
AAAAMMJJ au lieu de JJ/MM/AAAA (en évitant toutefois d'utiliser la
fonction S/elt1/elt2/, mais en recourant plutôt à une itération qui
parcourt élégamment chaque élément de @tabligne (résultat du split ma
ligne)...
Je pense qu'il y a sûrement moyen, étant donné que l'indice le plus
faible est 0 (pour le max qui n'est autres que la taille de la liste,
je ne sais pas s'il y a une variable standard Perl déjà disponible
pour l'occaz ...)
Extrait de mon fichier de données:
233;113456671111;10/12/2011;10/12/2011;M. DUPONT;ERVI;PARIS
456;908289877378:08/05/2001;17;04;2002;Melle DUPRE
Sylvie;ETTY;TOULOUSE
567;356536565365;01/03/1979;09/03/1983;Mme ZANNI Céline;ELSI;SAUMUR
Dans le code qui suit, listeDossiers est une table de hachage dans
laquelle je stocke le résultat d'une requête qui établit la
correspondance entre des codes dossiers a et des codes dossiers b.
...
# Lecture en séquentiel du fichier reçu
while ($ligne = <FIC_IN>) {
# Prise en compte de la ligne avec separateurs CSV (;)
@tabligne = split(';', $ligne);
print "Ligne en entrée : $ligne \n";
# Lecture de toutes les lignes sauf HDR/TRL
if (($ligne ne '') && ($ligne !~ m!^[Hh][Dd][Rr]|^[Tt][Rr][Ll]! )) {
chomp $ligne;
$cdossier_a=$tabligne[2];
# Recherche du code dossier b dans la requête de correspondance
cdossier_b-> cdossier_a
$cdossier_b=$listeDossiers{$cdossier_a};
if (!exists($listeDossiers{$cdossier_a})) {
print FIC_LOG "Le dossier $cdossier_a n\'existe pas \!\n";
} else {
$ligne=~ s/$cdossier_a/$cdossier_b/;
print FIC_OUT "$ligne\n";
}
}
print "Ligne en sortie : $ligne \n\n" ;
...
Merci beaucoup.
J'ai un fichier de donnée au format CSV (avec des caractères ; en
guise de séparateurs de valeurs) que je lis en séquentiel. En fait, je
voudrais remplacer le code dossier a figurant en 2e élément dans
l'extrait ci-dessous par le code dossier b, disponible dans ma table
de hachage d'une part, remplacer les dates apparaissant sur chaque en
ligne, en changeant le format pour qu'elles apparaissent en format
AAAAMMJJ au lieu de JJ/MM/AAAA (en évitant toutefois d'utiliser la
fonction S/elt1/elt2/, mais en recourant plutôt à une itération qui
parcourt élégamment chaque élément de @tabligne (résultat du split ma
ligne)...
Je pense qu'il y a sûrement moyen, étant donné que l'indice le plus
faible est 0 (pour le max qui n'est autres que la taille de la liste,
je ne sais pas s'il y a une variable standard Perl déjà disponible
pour l'occaz ...)
Extrait de mon fichier de données:
233;113456671111;10/12/2011;10/12/2011;M. DUPONT;ERVI;PARIS
456;908289877378:08/05/2001;17;04;2002;Melle DUPRE
Sylvie;ETTY;TOULOUSE
567;356536565365;01/03/1979;09/03/1983;Mme ZANNI Céline;ELSI;SAUMUR
Dans le code qui suit, listeDossiers est une table de hachage dans
laquelle je stocke le résultat d'une requête qui établit la
correspondance entre des codes dossiers a et des codes dossiers b.
...
# Lecture en séquentiel du fichier reçu
while ($ligne = <FIC_IN>) {
# Prise en compte de la ligne avec separateurs CSV (;)
@tabligne = split(';', $ligne);
print "Ligne en entrée : $ligne \n";
# Lecture de toutes les lignes sauf HDR/TRL
if (($ligne ne '') && ($ligne !~ m!^[Hh][Dd][Rr]|^[Tt][Rr][Ll]! )) {
chomp $ligne;
$cdossier_a=$tabligne[2];
# Recherche du code dossier b dans la requête de correspondance
cdossier_b-> cdossier_a
$cdossier_b=$listeDossiers{$cdossier_a};
if (!exists($listeDossiers{$cdossier_a})) {
print FIC_LOG "Le dossier $cdossier_a n\'existe pas \!\n";
} else {
$ligne=~ s/$cdossier_a/$cdossier_b/;
print FIC_OUT "$ligne\n";
}
}
print "Ligne en sortie : $ligne \n\n" ;
...
Merci beaucoup.