Estou recebendo um "arquivo csv" de um fornecedor (usando sua API), mas o que eles fazem é apenas espalhar a coisa toda em sua resposta. Não seria um problema significativo, exceto que, é claro, alguns daqueles humanos irritantes entraram nos dados e colocaram "recursos", como quebras de linha. O que estou fazendo agora é criar um arquivo para os dados brutos e reabri-lo para ler os dados:
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 alguma forma isso parece ... deselegante. Parece que eu deveria ser capaz de ler os dados do $ response-> content (cadeia de linhas multilinhas) como se fosse um arquivo. Mas estou desenhando um espaço em branco total sobre como fazer isso. Um ponteiro seria muito apreciado. Obrigado Paul
csv
perl
filehandle
Paul RN
fonte
fonte
Sim, você pode usar Text :: CSV_XS em uma string, por meio de sua interface funcional
Observe que isso realmente precisa
Text::CSV_XS
(normalmente Text :: CSV funciona, mas não com isso).Não sei por que isso não está disponível na interface OO (ou talvez esteja, mas não esteja documentado).
Enquanto o acima analisa a string diretamente conforme solicitado, também é possível diminuir o aspecto "deselegante" no seu exemplo, escrevendo o conteúdo diretamente em um arquivo à medida que ele é adquirido, com o que a maioria das bibliotecas suporta, como a
:content_file
opção no método LWP :: UserAgent :: get .Deixe-me observar também que na maioria das vezes você deseja que a biblioteca decodifique o conteúdo, para
LWP::UA
usá-lodecoded_content
(consulte HTTP :: Response ).fonte
Eu preparei este exemplo com o Mojo :: UserAgent . Para a entrada CSV, usei vários conjuntos de dados do NYC Open Data . Isso também aparecerá na próxima atualização para Mojo Web Clients .
Eu construo a solicitação sem fazer a solicitação imediatamente, e isso me dá o objeto de transação
$tx
,. Posso substituir oread
evento para enviar imediatamente as linhas para Text :: CSV_XS :Isso não é tão bom quanto eu gostaria, porque todos os dados ainda aparecem no buffer. Isso é um pouco mais atraente, mas é frágil da maneira que observo nos comentários. No momento, sou muito preguiçoso para melhorar, porque isso fica muito rápido quando você descobre que possui dados suficientes para processar um registro. Meu código específico não é tão importante quanto a idéia de que você pode fazer o que quiser, pois o transator lê dados e os passa para o manipulador de conteúdo:
fonte