以下逗号分隔值行包含几个连续的空字段:
$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
不是我想要的。当出现两个以上的连续逗号时会出现此问题。正则表达式一次吞噬两个逗号,因此它在重新扫描字符串时从第三个逗号而不是第二个逗号开始。
我认为这可能与前瞻与回溯断言有关,所以我尝试了以下正则表达式:
$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
那也没有用。它只是将逗号配对移动了一个。
我知道通过相同的正则表达式清洗这个字符串两次就可以了,但这似乎很粗糙。当然,必须有一种方法可以让单个正则表达式替换来完成这项工作。有什么建议么?
最终字符串应如下所示:
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