我有一个像这样的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;
任何帮助或提示都将受到赞赏。
答案 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
你可能想要:
$csv = Text::CSV::Encoded->new ({ encoding => "utf8" });
您可能 - 可能 - 需要指定您正在打开UTF-8文件。您可以将此作为open
或binmode
open ( my $filehandle, "<:encoding(UTF-8)", "Test.csv" );