|
|
|
|
Bonjour à tous,
j'ai un problème avec un script perl. Enfin lors d'une comparaison entre 2 chaines de caracteres visiblement identique, celle ci sont considérées comme étant différentes.
Voici ma comparaison :
$Compar = $BO{$cli}{$mod} cmp $SGI{$cli}{$mod};
print " comparaison : $Compar $BO{$cli}{$mod} et $SGI{$cli}{$mod} pour \n";
son résultat :
comparaison : -1
Location de T3, centre ville face mer§piscine, tennis sur place,§golf, casino, thalasso et cinéma à proximité.
Location de T3, centre ville face mer§piscine, tennis sur place,§golf, casino, thalasso et cinéma à proximité.
Et comment elles sont remplies a partir d'un fichier :
while ($Lig = <Fic>)
{
chomp $Lig;
($cli, $mod, $lig1, $lig2, $lig3) = split(/§/, $Lig);
$cli += 0;
$mod += 0;
$BO{$cli}{$mod} = "$lig1§$lig2§$lig3";
}
[...]
while ($Lig = <Fic>)
{
chomp $Lig;
($cli, $mod, $lig1, $lig2, $lig3) = split(/§/, $Lig);
$cli += 0;
$mod += 0;
if (! $BO{$cli}{$mod})
{
print Sortie "$cli-$mod\n";
$SGIseul ++;
}
else
{
$SGI{$cli}{$mod} = "$lig1§$lig2§$lig3";
}
}
if ($SGIseul == 0)
{
print Sortie "Aucun\n";
}
Vous auriez une piste?
Une fonction permettant de mettre en évidence les différences entre 2 chaines de caractères ?
Salut,
lami20j@debserv:~/trash$ cat fic.txt abcdef abcdef abcdef lami20j@debserv:~/trash$ perl -ne 's/(.)/ord($1)/egs;print "$_\n"' fic.txt 97989910010110210 9798991001011023210 979899100101102910 la deuxième ligne a un espace à la fin (ASCII 32) la 3ème une tabulation (ASCII 9) lami20j |
Après la conversion en caractères ascii, il y'a effectivement un probleme en fin de ligne .
|
Par contre, je m'interroge sur le chomp à présent : quel caractère supprime t'il ? le retour chariot ou le saut de ligne ?
perl -ne 's/\r//;s/(.)/ord($1)/egs;print "$_\n"' bopro3.csv perl -ne 's/(.)/ord($1)/egs;print "$_\n"' sgipro3.csv lami20j |
Merci beaucoup pour ton aide qui m'aura permis de cibler la cause du problème: l'encodage de mes fichiers.
|
Salut voila, je suis tomber sur ce post car je cherche à transformer mes caractère 10 en 1310 par une commande du genre:
|
Salut,
lami20j@debian:~$ cat -v fic1013.txt ligne1 ligne2 ligne3 lami20j@debian:~$ perl -ne 's/(.)/ord($1)/seg;print "$_\n"' fic1013.txt 1081051031101014910 1081051031101015010 1081051031101015110 lami20j@debian:~$ perl -pi.orig -e 's/\n/\r\n/' fic1013.txt lami20j@debian:~$ cat -v fic1013.txt ligne1^M ligne2^M ligne3^M lami20j@debian:~$ perl -ne 's/(.)/ord($1)/seg;print "$_\n"' fic1013.txt 108105103110101491310 108105103110101501310 108105103110101511310 lami20j@debian:~$ cat -v fic1013.txt.orig ligne1 ligne2 ligne3 lami20j@debian:~$ perl -ne 's/(.)/ord($1)/seg;print "$_\n"' fic1013.txt.orig 1081051031101014910 1081051031101015010 1081051031101015110 Cas 2 - fichier Win (fin ligne \r\n) vers fichier Unix (fin ligne \n) lami20j@debian:~$ perl -pi.orig -e 's/\r//' fic1013.txt lami20j@debian:~$ cat -v fic1013.txt ligne1 ligne2 ligne3 lami20j@debian:~$ perl -ne 's/(.)/ord($1)/seg;print "$_\n"' fic1013.txt 1081051031101014910 1081051031101015010 1081051031101015110 lami20j@debian:~$ cat -v fic1013.txt.orig ligne1^M ligne2^M ligne3^M lami20j@debian:~$ perl -ne 's/(.)/ord($1)/seg;print "$_\n"' fic1013.txt.orig 108105103110101491310 108105103110101501310 108105103110101511310 lami20j@debian:~$ Toujours en Perl il y a aussi la possibilité d'utiliser la couche E/S :ctrlf open FILE ,"<:crlf", "fichier.txt"; # ouvrir le fichier en lecture, effectue les substitutions de CRLF
#en saute de ligne et vice versa en fonction de OS utilisé
Une autre alternative c'est d'utiliser les commandes dos2unix et unix2dos. Pour la distribution Debian Etch il faut installer le paquet tofrodos : aptitude install tofrodos 106485010510997108 |