Pau*_*R N 8 csv perl filehandle
我从供应商那里得到了一个“csv 文件”(使用他们的 API),但他们所做的只是把整个事情都吐到他们的响应中。这不会是一个重大问题,当然,除了那些讨厌的人中的一些输入数据并放入诸如换行符之类的“功能”之外。我现在正在做的是为原始数据创建一个文件,然后重新打开它以读取数据:
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) ) { ...
Run Code Online (Sandbox Code Playgroud)
不知何故,这似乎……不雅。似乎我应该能够从 $response->content (多行字符串)中读取数据,就好像它是一个文件一样。但我对如何做到这一点完全空白。一个指针将不胜感激。谢谢,保罗
您可以使用字符串文件句柄:
my $data = $response->content;
open my $fh, "<", \$data or croak "unable to open string filehandle : $!";
my $csv = Text::CSV_XS->new({ binary=>1,always_quote=>1,eol=>$/ });
while ( $line = $csv->getline ($fh) ) { ... }
Run Code Online (Sandbox Code Playgroud)
是的,您可以通过其功能接口在字符串上使用Text::CSV_XS
use warnings;
use strict;
use feature 'say';
use Text::CSV_XS qw(csv); # must use _XS version
my $csv = qq(a,line\nand,another);
my $aoa = csv(in => \$csv)
or die Text::CSV->error_diag;
say "@$_" for @aoa;
Run Code Online (Sandbox Code Playgroud)
请注意,这确实需要Text::CSV_XS(通常Text::CSV有效,但不适用于此)。
我不知道为什么这在 OO 界面中不可用(或者可能是但没有记录)。
虽然上面直接按照要求解析字符串,但也可以通过在获取文件时直接将内容写入文件来减少示例中的“不雅”方面,大多数库都支持LWP::UserAgent::get方法中的:content_file选项。
我还要注意的是,大多数时候您希望库解码内容,以便LWP::UA使用decoded_content(请参阅HTTP::Response)。
| 归档时间: |
|
| 查看次数: |
372 次 |
| 最近记录: |