2

perl で解析していた csv ファイルが何週間もうまく機能していたのに、突然、正しく解析できなくなるという、非常に奇妙な (少なくとも私にとっては!) 状況があります。

関連情報:

  1. このファイルは、毎週更新される Salesforce.com からの抜粋です。
  2. 私が知る限り、ファイルはカンマで区切られており、エスケープ文字はありnewません
  3. 今日のファイルは約 16 行です (ヘッダーと、私が気にしない下部の不要な行を含めて)。したがって、評価したい7行のデータがあります。

私のperlコードは以下です。print $.しっかりしていると思いますが、ファイルが1つの長い文字列として読み取られているため、設定が欠けている可能性がありますprint $_。もちろん、その行は解析されません (そして、エラー メッセージは不可解です)。

アップデート:

問題は、SFDC からファイルを生成する方法にあることがわかりました。ファイルにCREnd of Line. 今日のファイルをダウンロードしたところ、 と が含まれてCRLFますEnd of Line。完璧に処理します。次に、昨日のファイルを投稿するために感度を下げ、編集したところ、キャリッジ リターンとライン フィードの両方が EOL 要素として取得されました。図に行く!

何らかの理由で、TEXT::CSVは EOL としてキャリッジ リターンのみを含むファイルを解析することを好みません。以下のコードには反映されていませんが、メソッド のEOL属性に対して可能なすべての設定を試しました。TEXT::CSV->new()

EOL フィードとしてキャリッジ リターンのみを使用してファイルを解析する方法を知っておくと役立つ可能性があるため、質問を開いたままにします。

use strict;
use warnings;
use diagnostics;
use Text::CSV;

my $datadump = "//myServer/WeeklyReport/data_dump.csv";
my $csv = Text::CSV->new({sep_char => ',', binary => 1});
open (CSV, "<", $datadump) or die $!;

while (<CSV>) {
    chomp $_;
    next if ($. == 1); # skip first line (contains headers)
    if ($csv->parse($_)) { # parse the line ...
        my @fields = $csv->fields(); 
        my $opp_owner = $fields[8];
        chomp $opp_owner;
        $owner_hash{$opp_owner} = "ignore"; # load into hash to delete duplicates
    } else { # if the line won't parse, return error
        my $err = $csv->error_input;
        print "Failed to parse line: $err";
    }
}

close CSV;
4

1 に答える 1