我可以使用 Text::CSV_XS 来解析 csv 格式的字符串而不将其写入磁盘吗?

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 (多行字符串)中读取数据,就好像它是一个文件一样。但我对如何做到这一点完全空白。一个指针将不胜感激。谢谢,保罗

GMB*_*GMB 6

您可以使用字符串文件句柄:

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)

  • 这是我最喜欢的 Perl 技巧之一,我在 [Effective Perl 编程](https://www. effectiveperlprogramming) 中写了很多关于它的内容。将许多东西视为文件句柄意味着您拥有更简单且熟悉的界面。反之亦然。您可以写入文件句柄,但将其显示在字符串中。 (3认同)
  • 是的,很好,我也使用它——只是不要忘记它不是一个正确的文件句柄,这样就不会遇到麻烦;例如,请参阅[这篇文章](/sf/ask/3293163821/)。 (3认同)

zdi*_*dim 5

是的,您可以通过其功能接口在字符串上使用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)。