4

.json ファイルを SAS に解析しようとしています。.json ファイルのリストを処理するために、[item1、item2、item3、.... itemn] の間のカンマをすべて削除したいのですが、[] 内にないカンマはそのままにしておきます。

prxchange正規表現を使用してこれを行うことができるはずだと思います...2つのアイテムリストで機能させることはできますが、異なる量のリストで機能するように変更する方法がわかりません.

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;

元の正規表現にもいくつかの問題がありました。多くの正規表現ヘルパー サイトの中で、これが私のお気に入りです。

于 2013-07-11T04:54:12.680 に答える
1

Leo の提案と同様に、より小さな prxchange を実行する場合は、SAS の DSD オプション (引用符を使用して埋め込まれた区切り記号を無視することができます) を利用できます。

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 に答える