Следующие строки значений через запятую содержат несколько последовательных пустых полей:
$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