在Perl中解析CSV文件时出现问题

在Perl中解析CSV文件时出现问题,perl,csv,Perl,Csv,我有一个如下的CSV文件: id,item,itemtype,date,service,level,message,action,user "344","-1","IRM","2008-08-22 13:01:57","login","1","Failed login: \'irm\', database \'irmD\'",NULL,NULL "346","-1","IRM","2008-08-27 10:58:59","login","1","Ошибка входа:\'\', база

我有一个如下的CSV文件:

id,item,itemtype,date,service,level,message,action,user
"344","-1","IRM","2008-08-22 13:01:57","login","1","Failed login: \'irm\', database \'irmD\'",NULL,NULL
"346","-1","IRM","2008-08-27 10:58:59","login","1","Ошибка входа:\'\', база данных \'irmD\'",NULL,NULL
第二行没有问题,但是Text::CSV跳过了第三行。第三行由西里尔字符组成,但是文件是用UTF-8编码的,Perl应该不会有任何问题

以及守则:

#!/usr/bin/perl
use warnings;
use strict;
use Text::CSV;
use utf8;

my $file = 'Test.csv'; my $csv = Text::CSV->new();
open (CSV, "<", $file) or die $!;
while (<CSV>) {
    if ($csv->parse($_)) {
        if ($. == 1) {
            next;
        }
        my @columns = $csv->fields();
        my $id=$columns[0];
        print $id." ";
    }
}
print "\n";
close CSV;
#/usr/bin/perl
使用警告;
严格使用;
使用Text::CSV;
使用utf8;
my$file='Test.csv';my$csv=Text::csv->new();

open(CSV),我想你的问题是,虽然你已经
使用了
edutf8,但这实际上只是用于perl。 发件人:

看着

您可能想要:

$csv = Text::CSV::Encoded->new ({ encoding  => "utf8" });
您还可能需要指定您正在打开一个UTF-8文件。您可以在
open
中或使用


open(my$filehandle),我想你的问题是,虽然你已经
使用了
ed UTF8,但这只是perl的用途。 发件人:

看着

您可能想要:

$csv = Text::CSV::Encoded->new ({ encoding  => "utf8" });
您还可能需要指定您正在打开一个UTF-8文件。您可以在
open
中或使用


open(my$filehandle),我想你的问题是,虽然你已经
使用了
ed UTF8,但这只是perl的用途。 发件人:

看着

您可能想要:

$csv = Text::CSV::Encoded->new ({ encoding  => "utf8" });
您还可能需要指定您正在打开一个UTF-8文件。您可以在
open
中或使用


open(my$filehandle),我想你的问题是,虽然你已经
使用了
ed UTF8,但这只是perl的用途。 发件人:

看着

您可能想要:

$csv = Text::CSV::Encoded->new ({ encoding  => "utf8" });
您还可能需要指定您正在打开一个UTF-8文件。您可以在
open
中或使用


open(my$filehandle),您是否阅读了的文档

如果你的 数据包含嵌入在字段中的换行符或0x7e以上的字符 (tilde)或二进制数据,必须设置“binary=>1”

另外,
useUTF8
告诉Perl您将在源代码中使用UTF-8,而不是在数据中。请删除它

文档中还提到使用
读取CSV:

while(){#错了!
以下是一个工作版本:

#!/usr/bin/perl
use warnings;
use strict;

use Text::CSV;

my $file = 'Test.csv';
my $csv = 'Text::CSV'->new({ binary => 1 }) or die 'Text::CSV'->error_diag;
open my $CSV, '<', $file or die $!;
while (my $line = $csv->getline($CSV)) {
    next if 1 == $.;

    my @columns = @$line;
    my $id = $columns[0];
    print $id . " ";
}
print "\n";
close $CSV;
!/usr/bin/perl
使用警告;
严格使用;
使用Text::CSV;
my$file='Test.csv';
my$csv='Text::csv'->新建({binary=>1})或die'Text::csv'->错误诊断;

打开我的$CSV,“您是否阅读了的文档

如果你的 数据包含嵌入在字段中的换行符或0x7e以上的字符 (tilde)或二进制数据,必须设置“binary=>1”

另外,
useUTF8
告诉Perl您将在源代码中使用UTF-8,而不是在数据中。请删除它

文档中还提到使用
读取CSV:

while(){#错了!
以下是一个工作版本:

#!/usr/bin/perl
use warnings;
use strict;

use Text::CSV;

my $file = 'Test.csv';
my $csv = 'Text::CSV'->new({ binary => 1 }) or die 'Text::CSV'->error_diag;
open my $CSV, '<', $file or die $!;
while (my $line = $csv->getline($CSV)) {
    next if 1 == $.;

    my @columns = @$line;
    my $id = $columns[0];
    print $id . " ";
}
print "\n";
close $CSV;
!/usr/bin/perl
使用警告;
严格使用;
使用Text::CSV;
my$file='Test.csv';
my$csv='Text::csv'->新建({binary=>1})或die'Text::csv'->错误诊断;

打开我的$CSV,“您是否阅读了的文档

如果你的 数据包含嵌入在字段中的换行符或0x7e以上的字符 (tilde)或二进制数据,必须设置“binary=>1”

另外,
useUTF8
告诉Perl您将在源代码中使用UTF-8,而不是在数据中。请删除它

文档中还提到使用
读取CSV:

while(){#错了!
以下是一个工作版本:

#!/usr/bin/perl
use warnings;
use strict;

use Text::CSV;

my $file = 'Test.csv';
my $csv = 'Text::CSV'->new({ binary => 1 }) or die 'Text::CSV'->error_diag;
open my $CSV, '<', $file or die $!;
while (my $line = $csv->getline($CSV)) {
    next if 1 == $.;

    my @columns = @$line;
    my $id = $columns[0];
    print $id . " ";
}
print "\n";
close $CSV;
!/usr/bin/perl
使用警告;
严格使用;
使用Text::CSV;
my$file='Test.csv';
my$csv='Text::csv'->新建({binary=>1})或die'Text::csv'->错误诊断;

打开我的$CSV,“您是否阅读了的文档

如果你的 数据包含嵌入在字段中的换行符或0x7e以上的字符 (tilde)或二进制数据,必须设置“binary=>1”

另外,
useUTF8
告诉Perl您将在源代码中使用UTF-8,而不是在数据中。请删除它

文档中还提到使用
读取CSV:

while(){#错了!
以下是一个工作版本:

#!/usr/bin/perl
use warnings;
use strict;

use Text::CSV;

my $file = 'Test.csv';
my $csv = 'Text::CSV'->new({ binary => 1 }) or die 'Text::CSV'->error_diag;
open my $CSV, '<', $file or die $!;
while (my $line = $csv->getline($CSV)) {
    next if 1 == $.;

    my @columns = @$line;
    my $id = $columns[0];
    print $id . " ";
}
print "\n";
close $CSV;
!/usr/bin/perl
使用警告;
严格使用;
使用Text::CSV;
my$file='Test.csv';
my$csv='Text::csv'->新建({binary=>1})或die'Text::csv'->错误诊断;

打开我的$CSV,'它不会是第一个在解析UTF-8时抛出的库。我解析了UTF-8边缘的JSON文件,但这不是一个问题。虽然不同的库。看起来Text::CSV中有用于UTF-8处理的选项。它不会是第一个在解析UTF-8时抛出的库。我解析了边缘的JSON文件是UTF-8的,但这不是问题。虽然是不同的库。看起来Text::CSV中有用于UTF-8处理的选项。这不是第一个在解析UTF-8时抛出的库。我解析了UTF-8边缘的JSON文件,但这不是问题。但是不同的库。看起来Text::CSV中有用于UTF-8处理的选项。这不是第一个在解析UTF-8时抛出的库。我已经解析了UTF-8边缘的JSON文件,但这不是问题。虽然是不同的库。看起来在Text::CSV中有用于UTF-8处理的选项。