次のコンマ区切り値の行には、いくつかの連続した空のフィールドが含まれています。
$rawData =
"2008-02-06,8:00 AM,14.0,6.0,59,1027,-9999.0,West,6.9,-,N/A,,Clear\n
2008-02-06,9:00 AM,16,6,40,1028,12,WNW,10.4,,,,\n"
これらの空のフィールドを「N/A」の値に置き換えたいので、正規表現の置換を介して置き換えることにしました。
私はまずこれを試しました:
$rawdata =~ s/,([,\n])/,N\/A/g; # RELABEL UNAVAILABLE DATA AS 'N/A'
戻ってきた
2008-02-06,8:00 AM,14.0,6.0,59,1027,-9999.0,West,6.9,-,N/A,N/A,Clear\n
2008-02-06,9:00 AM,16,6,40,1028,12,WNW,10.4,N/A,,N/A,\n
私が欲しかったものではありません。この問題は、3つ以上の連続したコンマが発生した場合に発生します。正規表現は一度に2つのコンマを飲み込むため、文字列を再スキャンするときは2番目ではなく3番目のコンマから始まります。
これは先読みアサーションと先読みアサーションに関係している可能性があると思ったので、次の正規表現を試してみました。
$rawdata =~ s/(?<=,)([,\n])|,([,\n])$/,N\/A$1/g; # RELABEL UNAVAILABLE DATA AS 'N/A'
その結果、次のようになりました。
2008-02-06,8:00 AM,14.0,6.0,59,1027,-9999.0,West,6.9,-,N/A,,N/A,Clear\n
2008-02-06,9:00 AM,16,6,40,1028,12,WNW,10.4,,N/A,,N/A,,N/A,,N/A\n
それもうまくいきませんでした。カンマペアを1つシフトしただけです。
この文字列を同じ正規表現で2回洗浄するとうまくいくことはわかっていますが、それは大雑把に思えます。確かに、仕事をするために単一の正規表現置換を取得する方法がなければなりません。助言がありますか?
最終的な文字列は次のようになります。
2008-02-06,8:00 AM,14.0,6.0,59,1027,-9999.0,West,6.9,-,N/A,N/A,N/A,Clear\n
2008-02-06,9:00 AM,16,6,40,1028,12,WNW,10.4,,N/A,,N/A,N/A,N/A,N/A,N/A\n