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

时间:2015-02-14 17:02:09

标签: perl csv utf-8 character-encoding

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

1 个答案:

答案 0 :(得分:2)

您可以尝试Encode::Detective。它可以在单行中使用如下:

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

将它放入你的剧本中应该不会太难。