在Perl中解析CSV文件的问题

时间:2014-12-18 09:55:11

标签: 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","Ошибка входа:\'\', база данных \'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;

任何帮助或提示都将受到赞赏。

2 个答案:

答案 0 :(得分:3)

您是否阅读了Text::CSV的文档?

  

如果你的          数据包含嵌入在字段中的换行符或0x7e以上的字符          (代字号)或二进制数据,必须设置&#34;二进制=&gt; 1&#34;

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

文档中还提到了使用<>读取CSV文件:

while (<>) {           #  WRONG!

这是一个工作版本:

#!/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;

答案 1 :(得分:0)

我认为你的问题是,当你use编辑UTF8时,这只是perl的用途。 从: http://perldoc.perl.org/utf8.html

utf8 - Perl pragma to enable/disable UTF-8 (or UTF-EBCDIC) in source code

查看Text::CSV

你可能想要:

$csv = Text::CSV::Encoded->new ({ encoding  => "utf8" });

您可能 - 可能 - 需要指定您正在打开UTF-8文件。您可以将此作为openbinmode

的一部分执行此操作

open ( my $filehandle, "<:encoding(UTF-8)", "Test.csv" );