Hola. A mi me funciona perfectamente. Lo único que he tenido que agregarle es un use open ':locale', ya que mis datos están codificados en utf8:
Using perl Syntax Highlighting
#!/usr/bin/env perl
use autodie;
use open IO => ':locale';
use Text::CSV; # Text::CSV_PP
my $csv = Text::CSV->new ({
# eol => $/, # final de línea
# binary => 1, # tratamiento binario de los campos
# decode_utf8 => 1, # los campos están en utf8
# quote_binary => 1, # los campos con datos binarios están entrecomillados
# auto_diag => 1, # avisa de errores
});
open my $io, '<', 'kk.txt';
while (my $fila = $csv->getline ($io)) {
# print $csv->string(), "\n"; # no funciona con Text::CSV_XS
my @campos = @$fila;
# aquí ya tenemos los @campos de la $fila
print join("|", @campos), "\n";
}
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Entonces, a partir del archivo
Using text Syntax Highlighting
Cristián,olivar,telecom
Pablo,olguin,salfast
Ignacio,Herrera,"solución,Ricoh.ltda"
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
tenemos esta salida:
Using text Syntax Highlighting
Cristián|olivar|telecom
Pablo|olguin|salfast
Ignacio|Herrera|solución,Ricoh.ltda
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Y me funciona tanto con Text::CSV como con Text::CSV_XS.
El tema de la codificación es importante: si el módulo detecta un byte que el considera que es binario, y ese campo no está entrecomillado, sacará este error (si está activada la opción auto_diag):
# CSV_XS ERROR: 2037 - EIF - Binary character in unquoted field, binary off
Podemos evitar ese caso (por ejemplo, 'Cristián', en el primer registro) añadiendo quote_binary => 0, por lo que admitirá esos casos.
Según tus datos estén en otras codificaciones, es posible que tengas que activar la opción
binary=>1 (según el manual, muy recomendable).
Esta es otra combinación que funciona, sin usar 'open locale':
Using perl Syntax Highlighting
#!/usr/bin/env perl
use autodie;
use Text::CSV;
my $csv = Text::CSV->new ({
eol => $/, # final de línea
binary => 1, # tratamiento binario de los campos
decode_utf8 => 1, # los campos están en utf8
quote_binary => 0, # los campos con datos binarios están entrecomilladas
auto_diag => 1, # avisa de errores
});
binmode(STDOUT, ':utf8'); # la salida del print -nuestra terminal- será en utf8
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
En fin, jugando con los parámetros del new(), es posible indicar cómo son los datos que estamos tratando. Pero lo principal, en el primer ejemplo, es que veas que con los valores por defecto, el módulo nos resuelve el problema.