簡體   English   中英

如何刪除SAS中兩個字符串之間的所有出現次數(0或多個)

[英]How to delete all occurrences (0 or many) of a character between two strings in SAS

我試圖將.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"]}" 

也許有更好的方法來解決這個問題......

有時處理正則表達式的最簡單方法是將其分解為步驟。 在這種情況下,首先獲取數組,然后用空格替換逗號:

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;

你的原始正則表達式也存在一些問題。 在許多正則表達式幫手網站中, 這個是我的最愛

如果你做一個較小的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中有意義,但你也可以使用單引號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM