从SAS中的字符串中提取子字符串

Extract substring from a string in SAS

我是这个论坛的新手。但是我也在这个网站上阅读了很多我在 SAS 编码中遇到的问题的答案。 我在工作中 运行 遇到 SAS 编码问题,希望有人能提供帮助。

我正在尝试从文本字符串中提取数字子字符串。数字字符串始终位于 "YR" 或 "YEAR" 等词之前。有时在数字子串和 "YR" 或 "YEAR" 之间有一个 space。 数字子字符串和文本字符串的长度都因 obs 而异。这是它的外观示例: Screenshot of SAS dataset

"YR"或"YEAR"前面的数字是我要提取的数字字符串。 我尝试使用 find fn 定位 "YR" 或 "YEAR" 所在的位置,然后使用 substrn 提取周围的字符串。然后压缩字符。但结果并不理想,因为有时它会提取字符串第一部分的数字,有时它不会提取整个数字(例如 4.75)。 这是我使用的代码:

if find(deal_type_oss, "YR","i") ne 0
then term=compress(substrn(deal_type_oss, find(deal_type_oss, "YR","i")-4,6),"","a");
if find(deal_type_oss,"Year","i") ne 0 
then term=compress(substrn(deal_type_oss, find(deal_type_oss, "Year","i")-4,6),"","a"); 

下面是这段代码的结果: Results of the code

提前致谢!

丑陋,但有效。

DATA _NULL_ ;
  INPUT ;
  deal_type_oss = _INFILE_ ;

  pastchar = INDEX(deal_type_oss,'YR') ; %* find the first character AFTER the year number ;
  IF NOT pastchar THEN
    pastchar = INDEX(deal_type_oss,'YEAR') ;

  temp_string = SUBSTR(deal_type_oss,1,pastchar-1) ; %* trim down to end with the year number ;

  prechar = ANYALPHA(REVERSE(TRIM(temp_string))) ; %* Find the last character BEFORE the year number ;

  numchar = SUBSTR(TRIM(temp_string),LENGTH(TRIM(temp_string))-prechar+2) ; %* Grab from that character before the year ;
  PUT deal_type_oss= numchar= ;
  DATALINES ;
USD2.75BN 4.5YR REV
USD110MM 5YR REV
USD340MM 5YR REV
USE40MM 5YR REVOLVER
USD3.5BN 5YR REVOLVER
USD2BN 4YR REV
USD3.5BN 4.75 YEAR REVOLVER
CAD500MM REV 3YR EXP
CAD75MM 5YR REVOLVER
USD1BN 5YR REVOLVER
;
RUN ;

尝试使用前瞻性正则表达式。这里,\s表示space,\S+表示任意一个以上的nonespace字符,\s?表示可能 space,?= 等于第一个正则表达式后面的 YR 或 YEAR。

data have;
input string & 0.;
year=prxchange('s/.*\s(\S+\s?)(?=YR|YEAR).*//',-1,string);
DATALINES ;
USD2.75BN 4.5YR REV
USD110MM 5YR REV
USD340MM 5YR REV
USE40MM 5YR REVOLVER
USD3.5BN 5YEAR REVOLVER
USD2BN 4YR REV
USD3.5BN 4.75 YEAR REVOLVER
CAD500MM REV 3YR EXP
CAD75MM 5YR REVOLVER
USD1BN 5YR REVOLVER
;
RUN ;