問題: Windows と *nix の両方で生成され、ほとんど *nix で処理されたデータ (ほとんどが CSV 形式) があります。Windows は行末に CRLF を使用し、Unix は LF を使用します。特定のファイルについて、行末が Windows なのか *nix なのかはわかりません。今まで、違いを処理するために次のようなものを書いてきました。
while (<$fh>){
tr/\r\n//d;
my @fields = split /,/, $_;
# ...
}
*nix では、\n の部分は chomping と同等であり、Windows で生成されたファイルの場合はさらに \r (CR) を取り除きます。
しかし、今は Text::CSV_XS b/c が必要です。引用符で囲まれたデータ、改行が埋め込まれている可能性のある奇妙なデータ ファイルを取得し始めています。このモジュールでそのようなファイルを読み取れるようにするには、Text::CSV_XS: :getline() では、行末文字を指定する必要があります。(上記の tr/\n\r//d のように各行を読み取ることができず、埋め込まれた改行を適切に処理しない Text::CSV b/c で解析します)。任意のファイルが Windows または *nix スタイルの行末を使用しているかどうかを適切に検出して、Text::CSV_XS::eol() に chomp() の方法を伝えるにはどうすればよいですか
行末を検出するだけの CPAN のモジュールが見つかりませんでした。最初にすべてのデータファイルを dos2unix 経由で変換したくありません。b/c ファイルが巨大 (数百ギガバイト) であり、ファイルごとに 10 分以上を費やして単純なものを処理するのはばかげているようです。ファイルの最初の数百バイトを読み取り、LF と CRLF をカウントする関数を作成することを考えましたが、これより良い解決策がないと信じています。
何か助けはありますか?
注: すべてのファイルは、完全に windows-line 末尾または *nix 末尾のいずれかです。つまり、両方が 1 つのファイルに混在していません。