如何自动识别输入流的编码[csv文件]



我有一组旧的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
    #
  }
}

您可以尝试Encode::Detective。它可以在一个内衬中使用如下:

perl -00 -MEncode::Detective=detect -E'open my $fh, "<", "file.csv" ; 
 my $content = <$fh>; $enc = detect ($content); say $enc'

把它融入你的剧本应该不会太难。

最新更新