2011-01-13 5 views
1

大きなファイルを1行ずつ読み込むスクリプトがあります。私が使用したいレコードセパレータ($/)は(\n)です。唯一の問題は、各行のデータにCRLF文字(\r\n)が含まれていることです。プログラムは行の終わりと見なすべきではありません。大きなファイルをperlで読み込み、レコードごとに動的レコードセパレータを使用する

例えば、ここで(書き出さ改行とのCRLFで)サンプル・データ・ファイルである:

line1contents\n 
line2contents\n 
line3\r\ncontents\n 
line4contents\n 

Iは$/ = "\n"を設定した場合、それは2行に第三の行を分割します。理想的には、ちょうど$/\nと一致し、\r\nではない正規表現に設定できますが、それは可能ではないと思います。別の方法としては、ファイル全体を読み込み、split関数を使って正規表現を分割する方法があります。唯一の問題は、ファイルが大きすぎてメモリにロードできないことです。

提案がありますか?

答えて

6

、それが終わるあなたの行を確認し、必要に応じて次の行を追加するために非常に簡単に聞こえる:

$/ = "\n"; 
... 
while(<$input>) { 
    while(substr($_,-2) eq "\r\n") { 
     $_ .= <$input>; 
    } 
    ... 
} 

これは、異なるプログラミングコンテキストの数でline continuationをサポートするために使用されるのと同じロジックです。

$/を正規表現に設定することはできません。

+0

+1:これは、指定されたデータを処理するための唯一の提案です。 'dos2unix'で変換すると、ファイルの構造が完全に破壊され、 '\ r \ n'をスペース、タブなどに変換するのはおそらく難しいでしょう。行のメインテキストには表示されない置換を選択する必要があります。 –

+0

ありがとう、これは私が考えると信じられない非常に簡単なアプローチです。これは、パターンがより複雑なより一般的な場合にも適用できます。 –

+1

[Data :: Record](http://p3rl.org/Data::Record)の 'split'は正規表現です。 – daxim

0

最初にファイルにdos2unixを使用して、通常どおりに読み込みます。この特定のタスクのために

+0

OPから、\ r \ nは*エスケープ* \ nであり、「悪い」ではないようです。\ n – Dallaylaen

1

dos2unixはUNIXの改行文字を "\ r \ n"に置きますので、実際には問題は解決しません。私はスペースやタブ文字で "\ r \ n"のすべてのインスタンスを置き換え、その結果を別のファイルに保存する正規表現を使用します(その点で行を分割したくないため)。それから私はあなたのスクリプトを新しいファイルで実行します。

+0

SEDスクリプトはここでは良いプリプロセッサになると思います。 –

+0

はい、それは素晴らしい提案です。 –

関連する問題