我在SAS中有一个长文本字符串,并且其中的值是可变长度的,但始终以'#'开头,然后以','
结尾有没有一种方法可以将其提取并存储为新变量?
例如: 单词,单词,单词,#12.34,单词,单词
我想得到12.34
谢谢!
答案 0 :(得分:2)
如果只有一个#
,则双重扫描也应该起作用:
data _null_;
var1 = 'word word, word, #12.34, word, word';
var2 = scan(scan(var1,2,'#'),1,',');
put var2=;
run;
答案 1 :(得分:0)
您可以使用substr
和index
函数来执行此操作。 index
函数返回指定字符的第一个位置。
data _null_;
var1 = 'word word, word, #12.34, word, word';
pos1 = index(var1,'#'); *Get the position of the first # sign;
tmp = substr(var1,pos1+1); *Create a string that returns only characters after the # sign;
put tmp;
pos2 = index(tmp,','); *Get the position of the first "," in the tmp variable;
var2 = substr(tmp,1,pos2-1);
put var2;
run;
请注意,此方法仅在字符串中只有一个“#”时有效。
答案 2 :(得分:0)
另一种方法是使用Regex,下面给出代码
null
关于以下正则表达式和函数的小注释
(?<=#)零宽度正向后断言并在感兴趣的模式之前寻找#
(\ d +。?\ d +)在这里表示数字后跟或不后跟。和其他数字
(?=,)感兴趣模式后的零宽度正向超前断言并寻找
调用prxsubstr查找图案的位置和长度,并substr提取所需的值。
data have;
infile datalines truncover ;
input var $200.;
datalines;
word word, word, #12.34, word, word
word1 #12.34, hello hi hello hi
word1 #970000 hello hi hello hi #970022, hi
word1 123, hello hi hello hi #97.99
#99456, this is cool
;
答案 3 :(得分:0)
一种方法是使用index
来定位两个界定值的“哨兵”,并使用substr
检索内部。如果该值应为数字,则需要额外使用input
函数。
第二种方法是使用正则表达式例程prxmatch
和prxposn
来查找和提取嵌入的值。
data have;
input;
longtext = _infile_;
datalines;
some thing #12.34, wicked
#, oops
#5a64, oops
# oops
oops ,
oops #
ok #1234,
who wants be a #1e6,aire
space # , the final frontier
double #12, jeopardy #34, alex
run;
data want;
set have;
* locate with index;
_p1 = index(longtext,'#');
if _p1 then _p2 = index(substr(longtext,_p1),',');
if _p2 > 2 then num_in_text = input (substr(longtext,_p1+1,_p2-2), ?? best.);
* locate with regular expression;
if _n_ = 1 then _rx = prxparse('/#(\d*\.?\d*)?,/'); retain _rx;
if prxmatch(_rx,longtext) then do;
call prxposn(_rx,1,_start,_length);
if _length > 0 then num_in_text_2 = input (substr(longtext,_start, _length), ?? best.);
end;
* drop _: ;
run;
正则表达式方法查找##。##变体,索引方法仅查找#...,。然后,输入函数将破译正则表达式(示例模式)不会“定位”的科学计数值。 input
函数中的 ?? 选项可防止使用无效的参数。注意:如果不能将封闭的值解析为数字,则在日志中注意:
答案 4 :(得分:-1)
如果你想变得很懒,那就可以做
want = compress(have,".","kd");