我有一组旧的CSV文件是使用不兼容的编码创建的,包括utf-8和iso 8859-2。现在我将它们导入到数据库中,当然我想说,无论原始编码如何,都说“krzesło”是这样的。如果它们都是utf文件,那将很简单:我已经找到了Text :: CSV和Text :: CSV :: Encoded模块,对于utf文件,它们都像一个快照一样工作。
问题是,有些文件是用8859-2 8位编码编码的,如果我试图用utf表示盲目地替换字符,如果该行已经用utf编码,我可能会破坏utf编码。
我考虑在文件级别识别编码并在导入之前转换文件,但文件不是我的,我仍然收到新数据,我不确定是否保证未来的文件都是utf编码的。
我的程序的一般算法如下:
use utf8;
use Encode qw(encode decode);
use open ':std', ':encoding(UTF-8)';
my $csv = Text::CSV::Encoded->new (
{
encoding_in => "utf8",
encoding_out => "utf8",
binary => 0,
sep_char => ';',
eol => $/
} ) # should set binary attribute.
or die "Cannot use CSV: ".Text::CSV->error_diag ();
while (<>) {
if ($_ not in utf) { convert $_ to utf }
if ($csv->parse($_)) {
#
# further field-level processing
#
}
}
答案 0 :(得分:2)
您可以尝试Encode::Detective
。它可以在单行中使用如下:
perl -00 -MEncode::Detective=detect -E'open my $fh, "<", "file.csv" ;
my $content = <$fh>; $enc = detect ($content); say $enc'
将它放入你的剧本中应该不会太难。