4

我正在尝试将 .json 文件解析为 SAS。为了处理 .json 文件中的列表,我想删除 [item1, item2, item3, .... itemn] 之间的所有逗号,但保留不在 [] 内的逗号。

我想我应该能够使用 prxchange 正则表达式来做到这一点......我可以让它适用于两个项目列表,但无法弄清楚如何改变它以适用于不同数量的列表。

newvariable=prxchange('s/(\[\w+),(\w+\])/$1 $2',-1,oldvariable);

例子:

oldvariable = "{"hospital": "NOP", "drugs": ["penicillin", "ampicillin", "cephalosporin"]}" 
newvariable = "{"hospital": "NOP", "drugs": ["penicillin" "ampicillin" "cephalosporin"]}" 

oldvariable = "{"hospital": "KOP", "drugs": ["tetracycline"]}" 
newvariable = "{"hospital": "KOP", "drugs": ["tetracycline"]}" 

也许有更好的方法来解决这个问题......

4

2 回答 2

4

有时处理正则表达式的最简单方法是将其分解为多个步骤。在这种情况下,首先取出数组,然后用空格替换逗号:

data _null_;
oldvariable = '{"hospital": "NOP", "drugs": ["penicillin", "ampicillin", "cephalosporin"]}';
arrayExpr=prxparse( '/\[[^]]+\]/' );
call prxsubstr( arrayExpr, oldvariable, position, length );
put position length;
newvariable=cat(
    substr( oldvariable, 1, position - 1 ),
    prxchange( 's/, / /', -1, substr( oldvariable, position, length ) ),
    substr( oldvariable, position + length )
);
put newvariable;
run;

你原来的正则表达式也有一些问题。在众多 regex-helper 站点中,这是我最喜欢的一个。

于 2013-07-11T04:54:12.680 回答
1

如果您执行较小的 prxchange,您可以利用 SAS 的 DSD 选项(它允许您使用引号来忽略嵌入式分隔符),类似于 Leo 的建议。

data have;
infile datalines dlm=',' dsd;
input @;
_prx = prxparse('s~\[([0-9,]*?)\]~"$1"~io');
_prxm = prxmatch(_prx,_infile_);
if _prxm then call prxchange(_prx,-1,_infile_);
_test_=_infile_;
input a b $ c d $;
datalines;
1,Hello,2,3
2,Goodbye,3,[4,5,6]
;;;;
run;

在您的情况下,我不确定双引号是否有效,因为它们在 JSON 中具有含义,但您也可以使用单引号。

于 2013-07-11T13:42:33.980 回答