Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl:在数据中使用新行解析csv,但不使用quotest_Perl_Csv - Fatal编程技术网

Perl:在数据中使用新行解析csv,但不使用quotest

Perl:在数据中使用新行解析csv,但不使用quotest,perl,csv,Perl,Csv,我有一个解析csv的简单perl脚本 my $csv = Text::CSV->new( { auto_diag => 1, allow_loose_quotes => 1, eol => "\r\n", sep_char => '|', allow_unquoted_escape => 1,

我有一个解析csv的简单perl脚本

my $csv = Text::CSV->new(
    {   auto_diag             => 1,
        allow_loose_quotes    => 1,
        eol                   => "\r\n",
        sep_char              => '|',
        allow_unquoted_escape => 1,
        escape_char           => '\\',
        binary                => 1
    }
    )
    or die "" . Text::CSV->error_diag();
现在我有一个wierd csv

01|10|Alpha|Test
01|20|Alpha
2|Test

虽然看起来有3行,最后一行是“Alpha\n2”,但不幸的是,我的源系统没有用引号发送它们,有没有办法成功使用csv???

Text::csv只是Text::csv_PP或Text::csvx的代理。我可以在这两种情况下复制错误

use strict;
use warnings;
use feature qw( say );

use Data::Dumper qw( );
use Text::CSV_XS qw( );   # Or Text::CSV_PP

sub dumper {
    local $Data::Dumper::Indent = 0;
    local $Data::Dumper::Terse  = 1;
    local $Data::Dumper::Useqq  = 1;
    return Data::Dumper::Dumper($_[0]);
}

my $csv = Text::CSV_XS->new({   # Or Text::CSV_PP
    auto_diag             => 2,
    allow_loose_quotes    => 1,
    eol                   => "\r\n",
    sep_char              => '|',
    allow_unquoted_escape => 1,
    escape_char           => '\\',
    binary                => 1
});

my $file = "01|10|Alpha|Test\r\n01|20|Alpha\n2|Test\r\n01|30|Alpha|Test\r\n";
open(my $fh, '<:raw', \$file) or die $!;
my $rows = $csv->getline_all($fh);
say dumper($rows);
预期产出:

[["01",10,"Alpha","Test"],["01",20,"Alpha\n2","Test"],["01",30,"Alpha","Test"]]

若他们从不使用引号或转义符,只需读取CRLF终止的行并在管道上拆分即可

use strict;
use warnings;
use feature qw( say );

use Data::Dumper qw( );

sub dumper {
    local $Data::Dumper::Indent = 0;
    local $Data::Dumper::Terse  = 1;
    local $Data::Dumper::Useqq  = 1;
    return Data::Dumper::Dumper($_[0]);
}

my $file = "01|10|Alpha|Test\r\n01|20|Alpha\n2|Test\r\n01|30|Alpha|Test\r\n";
open(my $fh, '<:raw', \$file) or die $!;
my @rows = do { local $/ = "\r\n"; map { [ split(/\|/, substr($_, 0, -2), -1) ] } <$fh> };
say dumper(\@rows);
使用严格;
使用警告;
使用特征qw(例如);
使用Data::Dumper qw();
分卸汽车{
本地$Data::Dumper::Indent=0;
本地$Data::Dumper::Terse=1;
本地$Data::Dumper::Useqq=1;
返回数据::转储程序::转储程序($U0]);
}
my$file=“01 | 10 | Alpha | Test\r\n01 | 20 | Alpha\n2 | Test\r\n01 | 30 | Alpha | Test\r\n”;

open(my$fh,'是代码中描述为“\r\n”的实际行尾,而不仅仅是“\n”?仅此而已,我尝试了\n和\r\n两种方法,但都失败了。meIs的格式是否有任何特定的内容--字段数量,换行符不能出现,字段中的预期模式…?如果是,您可以预处理文件以清理它。如果不是,那么,
\n
表示行的结尾,就像所有其他行一样。我正在考虑预处理这是唯一的方法……谢谢:)如果你能找出数据中的任何规律性,这应该不是问题。我建议在清理时停止重新处理,然后使用
Text::CSV
。不确定行是否由\r\n终止,我将再次查看,如果不是,则将尝试按照@zdim的建议进行一些预处理以清理内容如果行以换行结束,如果字段的数量已知,并且最后一个字段从不包含换行符,则仍然可以修复数据。在这种情况下,一行由N-1个以管道结尾的字段组成,然后是一个以换行符结尾的字段。
use strict;
use warnings;
use feature qw( say );

use Data::Dumper qw( );

sub dumper {
    local $Data::Dumper::Indent = 0;
    local $Data::Dumper::Terse  = 1;
    local $Data::Dumper::Useqq  = 1;
    return Data::Dumper::Dumper($_[0]);
}

my $file = "01|10|Alpha|Test\r\n01|20|Alpha\n2|Test\r\n01|30|Alpha|Test\r\n";
open(my $fh, '<:raw', \$file) or die $!;
my @rows = do { local $/ = "\r\n"; map { [ split(/\|/, substr($_, 0, -2), -1) ] } <$fh> };
say dumper(\@rows);