0

perl スクリプトを使用して別のサーバーから CSV ファイルをダウンロードします。ダウンロード後、ファイルに破損したデータが含まれていないかどうかを確認したいと思います。Encode::Detect::Detector を使用してエンコーディングを検出しようとしましたが、どちらの場合も「undef」を返します。

  1. 文字列が ASCII の場合、または
  2. 文字列が壊れている場合

したがって、以下のプログラムを使用すると、ASCII データと破損データを区別できません。

 use strict;
 use Text::CSV;
 use Encode::Detect::Detector;
 use XML::Simple;
 use Encode;
 require Encode::Detect;

 my @rows;
 my $init_file = "new-data-jp-2013-8-8.csv";



 my $csv = Text::CSV->new ( { binary => 1 } )
                 or die "Cannot use CSV: ".Text::CSV->error_diag ();

 open my $fh, $init_file or die $init_file.": $!";

 while ( my $row = $csv->getline( $fh ) ) {
     my @fields = @$row; # get line into array
     for (my $i=1; $i<=23; $i++){  # I already know that CSV file has 23 columns
            if ((Encode::Detect::Detector::detect($fields[$i-1])) eq undef){
                print "the encoding is undef in col".$i.
                            "  where field is ".$fields[$i-1].
                            " and its length is  ".length($fields[$i-1])." \n";
            }
            else {
            my $string = decode("Detect", $fields[$i-1]);
            print "this is string print  ".$string.
                    " the encoding is ".Encode::Detect::Detector::detect($fields[$i-1]).
                    " and its length is  ".length($fields[$i-1])."\n";
            }
        }   
     }
4

1 に答える 1

1

エンコーディングについていくつかの悪い仮定があり、スクリプトにいくつかのエラーがあります。

foo() eq undef

意味がありません。undef文字列ではないため、文字列の等価性を と比較することはできませんundef。ただし、空の文字列に文字列化します。use warningsそのようなゴミをすると、エラーメッセージが表示されるはずです。値が でないかどうかをテストするには、次undefを使用しますdefined

unless(defined foo()) { .... }

Encode::Detector::Detectモジュールは、オブジェクト指向インターフェースを使用します。したがって、

Encode::Detect::Detector::detect($foo)

間違っています。docsによると、あなたはやるべきです

Encode::Detect::Detector->detect($foo)

おそらく、フィールドごとにデコードすることはできません。通常、1 つのドキュメントには 1 つのエンコーディングがあります。ファイルハンドルを開くときにエンコーディングを指定する必要があります。

use autodie;
open my $fh, "<:utf8", $init_file;

CSV はある程度のバイナリ データ (エンコードされたテキストなど) をサポートできますが、この目的にはあまり適していないため、別のデータ形式を選択することをお勧めします。

最後に、ASCII データは事実上、デコーディングやエンコーディングを必要としません。undefエンコード検出の結果は、ここでは意味があります。ドキュメントが ASCII にエンコードされたと断言することはできません (多くのエンコーディングは ASCII のスーパーセットであるため)。むしろ、Latin-1、UTF-8 のようなより複雑なエンコーディングにします。

于 2013-09-20T09:02:42.817 に答える