2017-02-19 10 views
2

私はWindowsでperlを実行していますが、CRLF(0d0a)の行のテキストファイルがあります。問題は、Windowsのperlで行を分割して処理しているファイルの周りにこれらの時折の0a文字が散在していることです。私の考えは、ファイルを前処理して、CRLFで分割された行を読み込むことですが、少なくともWindowsでは、LFで分割することを主張しています。テキストファイルから余分な改行文字を取り除くためのスクリプトが必要です

完全に0x0dを欠場するようだ...私は$/

local $/ = 0x0d; 
open(my $fh, "<", $file) or die "Unable to open $file"; 
while (my $line = <$fh>) { 
    # do something to get rid of the 0x0a embedded in the line of text; 
} 

を設定しようとしました...が、これは複数行を読み取ります。私はまた、 "\ n"、 "\ n \ r"、 "\ r"、 "\ r \ n"に設定しようとしました。これを行う簡単な方法が必要です!

ファイルを正しく処理できるようにする必要があります。だから、ファイルを開く、CRLFでファイルを分割する、0dで始まらない0aを見つけて、それを爆破して1行ずつ新しいファイルに保存するスクリプトが必要です。

ご協力いただきありがとうございます。

+0

この正規表現は次のとおりです: 'qr /([\ n \ x {0B} \ f \ r \ x {85}] {1,2})/;たぶん[ファイル::編集::ポータブル](https://metacpan.org/release/STEVEB/File-Edit-Portable-1.24) – stevieb

答えて

2

local $/ = 0x0d;local $/ = "\x0d";でなければなりません。

それ以外は、デフォルトでWindowsのファイルハンドルに:crlfレイヤーが追加されるという問題があります。これにより、CRLFは、読み取り時にLFに変換されます(また、その逆も同様です)。したがって、あなたが読んだ内容にはCRが存在しないので、ファイル全体が読み込まれます。

:crlfを単に削除するか無効にするかは、このトリックを行います。

local $/ = "\x0D\x0A"; 
open(my $fh, "<:raw", $file) 
    or die("Can't open \"$file\": $!\n"); 

while (<$fh>) { 
    chomp; 
    s/\x0A//g; 
    say; 
} 
+0

それは良いです。かなり短くポイントに。ありがとう。 –

2

このソリューションは、バイナリモードでデータを読み取ることによって機能します。手始めに

open(my $INFILE, "<:raw", $infile) 
    or die "Can't open \"$infile\": $!\n"); 
open(my $OUTFILE, ">:raw", $outfile) 
    or die "Can't create \"$outfile\": $!\n"); 

my $buffer = ''; 
while (sysread($INFILE, $buffer, 4*1024*1024)) { 
    $buffer =~ s/(?<!\x0D)\x0A//g; 

    # Keep one char in case we cut between a CR and a LF. 
    print $OUTFILE substr($buffer, 0, -1, ''); 
} 

print $OUTFILE $buffer; 
+0

(気分が元に戻ってきます。私はちょうどあなたがクリーンアップに感謝したいと思った) – ikegami

関連する問題