Les lignes de valeurs séparées par des virgules suivantes contient plusieurs champs vides consécutifs:Comment utiliser Perl pour intercaler des caractères entre des correspondances consécutives avec une substitution d'expressions régulières?
$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"
Je veux remplacer ces champs vides avec des valeurs « N/A », qui est la raison pour laquelle j'ai décidé de le faire via une substitution regex .
J'ai essayé tout d'abord:
$rawdata =~ s/,([,\n])/,N\/A/g; # RELABEL UNAVAILABLE DATA AS 'N/A'
qui sont retournés
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
pas ce que je voulais. Le problème se produit lorsque plus de deux virgules consécutives se produisent. L'expression rationnelle englobe deux virgules à la fois, de sorte qu'elle commence à la troisième virgule plutôt qu'à la seconde lorsqu'elle redessine la chaîne.
Je pensais que cela pourrait être quelque chose à voir avec les affirmations lookback par rapport préanalyse, alors j'ai essayé la regex suivante sur:
$rawdata =~ s/(?<=,)([,\n])|,([,\n])$/,N\/A$1/g; # RELABEL UNAVAILABLE DATA AS 'N/A'
qui a abouti à:
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
Cela n'a pas fonctionné non plus. Il a juste décalé les paires de virgules par un.
Je sais que le lavage de cette chaîne par le même regex deux fois le fera, mais cela semble brut. Sûrement, il doit y avoir un moyen d'obtenir une seule substitution de regex pour faire le travail. Aucune suggestion?
La chaîne finale devrait ressembler à ceci:
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
La réponse de @Zaid @ ysth fait exactement ce que vous voulez. –