問題:私はWindowsと* nixの両方で作成され、主に* nixで処理されたデータを(ほとんどCSV形式で)持っています。 Windowsは行末にCRLFを使用し、UNIXはLFを使用します。特定のファイルについては、ウィンドウや* nix行の終わりがあるかどうかわかりません。 * nixの上Perlでファイルの行末を正しく検出しますか?
while (<$fh>){
tr/\r\n//d;
my @fields = split /,/, $_;
# ...
}
\ nの部分がムシャムシャに相当し、さらに、それは窓があります場合は、\ rを(CR)を取り除く:今まで、私は違いを処理するために、このような何かを書いてきました生成されたファイル。
しかし、今私はテキスト:: 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を数える関数を書くことを考えましたが、これはもっと良い解決策がないと信じることを拒否します。
助けが必要ですか?
注:すべてのファイルは、完全にウィンドウラインの終了点または* nixの終了点を持っています。つまり、両方が1つのファイルに混在しているわけではありません。
ありがとうございます、以前はPerlIOについて知りませんでした。これはまさに私が必要としていたものです。 – user1481