获取两个特定字符位置之间的字符串

时间:2018-07-31 10:43:31

标签: sas scanf extract substr

我在SAS中有一个长文本字符串,并且其中的值是可变长度的,但始终以'#'开头,然后以','

结尾

有没有一种方法可以将其提取并存储为新变量?

例如: 单词,单词,单词,#12.34,单词,单词

我想得到12.34

谢谢!

5 个答案:

答案 0 :(得分:2)

如果只有一个#,则双重扫描也应该起作用:

data _null_;
  var1 = 'word word, word, #12.34, word, word';
  var2 = scan(scan(var1,2,'#'),1,',');
  put var2=;
run;

答案 1 :(得分:0)

您可以使用substrindex函数来执行此操作。 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函数。

第二种方法是使用正则表达式例程prxmatchprxposn来查找和提取嵌入的值。

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");