Recibo un "archivo csv" de un proveedor (usando su API), pero lo que hacen es arrojar todo en su respuesta. No sería un problema significativo, excepto que, por supuesto, algunos de esos molestos humanos ingresaron los datos y agregaron "características" como saltos de línea. Lo que estoy haciendo ahora es crear un archivo para los datos sin procesar y luego volver a abrirlo para leer los datos:
open RAW, ">", "$rawfile" or die "ERROR: Could not open $rawfile for write: $! \n";
print RAW $response->content;
close RAW;
my $csv = Text::CSV_XS->new({ binary=>1,always_quote=>1,eol=>$/ });
open my $fh, "<", "$rawfile" or die "ERROR: Could not open $rawfile for read: $! \n";
while ( $line = $csv->getline ($fh) ) { ...
De alguna manera esto parece ... poco elegante. Parece que debería poder leer los datos del $ response-> content (cadena multilínea) como si fuera un archivo. Pero estoy dibujando un espacio en blanco sobre cómo hacer esto. Un puntero sería muy apreciado. Gracias paul
csv
perl
filehandle
Paul RN
fuente
fuente
Sí, puede usar Text :: CSV_XS en una cadena, a través de su interfaz funcional
Tenga en cuenta que esto realmente necesita
Text::CSV_XS
(normalmente Text :: CSV funciona pero no con esto).No sé por qué esto no está disponible en la interfaz OO (o tal vez sí, pero no está documentado).
Si bien lo anterior analiza la cadena directamente como se le solicitó, también se puede disminuir el aspecto "poco elegante" en su ejemplo al escribir contenido directamente en un archivo a medida que se adquiere, lo que admite la mayoría de las bibliotecas con la
:content_file
opción en LWP :: UserAgent :: get método .Permítanme también señalar que la mayoría de las veces desea que la biblioteca decodifique el contenido, para
LWP::UA
que lo usedecoded_content
(vea HTTP :: Response ).fuente
He preparado este ejemplo con Mojo :: UserAgent . Para la entrada CSV utilicé varios conjuntos de datos de NYC Open Data . Esto también aparecerá en la próxima actualización para Mojo Web Clients .
Construyo la solicitud sin realizar la consulta de inmediato, y eso me da el objeto de transacción,
$tx
. Entonces puedo reemplazar elread
evento para poder enviar inmediatamente las líneas a Text :: CSV_XS :Eso no es tan bueno como me gustaría que sea porque todos los datos aún se muestran en el búfer. Esto es un poco más atractivo, pero es frágil en las formas que noto en los comentarios. Soy demasiado vago en este momento para mejorarlo porque eso se vuelve muy rápido cuando te das cuenta de que tienes suficientes datos para procesar un registro. Mi código particular no es tan importante como la idea de que puedes hacer lo que quieras mientras el transactor lee los datos y los pasa al controlador de contenido:
fuente