2012-02-12 6 views
2

.csvファイルから行を読み込むための単純なperlスクリプトを作成しました。コードは以下の通りである:perlスクリプトで "2032 - EIF - CR charが引用符で囲まれず、EOL @ posの一部ではありません"というエラーが発生しました

#!/usr/bin/perl 

use strict; 
use warnings; 

use Text::CSV; 

my $csv = Text::CSV->new({ binary => 1 }); 


open my $fh, "<", "testresults.csv" or die "testresults.csv $!"; 
while (my $row = $csv->getline($fh)) { 
     my @fields = @$row; 
} 
$csv->eof or $csv->error_diag; 
close $fh or die "testresults.csv $!"; 

そしてtestresults.csvファイルは次のようになります。

ノード1、ノード2、ノード3、ノード4、MAP1、MAP2、MAP3、MAP4、MAP5、map6、map7 、MAP8、DM、LAT、AVG、製品各ライン上の結果に続いて最初の行に

NAME1、NAME2、NAME3、NAME4、ノード1、ノード2、ノード3、ノード4、ノード5、ノード6、ノード7、ノード8,0%、
、 0.002835480002,0.1714008533,4.86003691857886E-04

など。私は、コマンドプロンプトから./filename.pl行う際

私は自分のコードで、次のエラーを取得しています: CSV_XSをERROR:2032 - EIF - EOLの@ POSの引用符で囲まれていない、いない部分の内側CR炭420

私はこのエラーについてGoogleに挑戦しましたが、このエラーを十分に理解できませんでした。

+1

あなたは、あなたがそれらを期待していないあなたのデータに隠されたいくつかの文字を持っているように聞こえます。 'Data :: Dumperを使ってみてください。 $ Data :: Dumper :: Useqq = 1; 'そして、while(<$fh>){print Dumper $ _}'で数行を印刷してみてください。かなり一般的な問題は、Windowsタイプの行末を持つことです。 – TLP

+0

@TLP:あなたは非常に有効なポイントがあると思います。 testresults.csvは、Linux上でperlスクリプトを実行している間に、Windowsマシン上の別のVBスクリプトによって作成されました。私はこれを整理することができるかどうかわかります。助けてくれてありがとう! –

+0

問題ありません。特定の行が終了している場合は、Text :: CSVオプションで設定することができます。 'eol =>" \ r \ n "' – TLP

答えて

3

エラーがヌル文字でインターレースされた入力で文字列の来、迅速なハックがヌル文字を削除することです

use Data::Dumper; 
$Data::Dumper::Useqq = 1; 
while (<$fh>) { 
    print Dumper $_; 
} 

を使用することにより可視化されていることをコメントで私たちの会話からと思われます以下のようなもので、入力ファイル内:

perl -i.bak -pwe 'tr/\0//d' testresults.csv 

注:しかし、エンコードの問題でより多くの経験を積んだ人からのコメントで指摘されているように、これは//decodiによって解決されなければならない可能性ができます代わりにデータを保存してください。悪いシンボルを取り除くだけで、微妙な方法でデータが破損する可能性があり、理想的な解決策ではありません。

申し訳ありませんが、それについてはあまりよく分かりませんが、Text::CSV::Encodedを使用すると、cjmのようにうまく始まります。

+0

はチャームのように機能します!ありがとう! –

+0

ようこそ。 Data :: Dumperは、優れたデバッグツールです。次回までそれを覚えておいてください! – TLP

+0

確かに!私はまだperlに慣れています。 –

関連する問題