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

时间:2016-01-07 23:44:45

标签: string find sas compression substring

我是这个论坛的新手。但是我在本网站上已经阅读了许多SAS编码问题的答案。 我在工作中遇到了SAS编码问题,希望有人可以提供帮助。

我正在尝试从文本字符串中提取数字子字符串。数字字符串总是在" YR"之类的字之前。或"年"。有时在数字子串和" YR"之间有一个空格。或"年"。 数字子字符串和文本字符串的长度从obs到obs不等。以下是它的外观示例: Screenshot of SAS dataset

之前的数字" YR"或者"年份"是我想要提取的数字字符串。 我试过用find fn找到" YR"或者"年份"然后使用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

提前谢谢!

2 个答案:

答案 0 :(得分:1)

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

data have;
input string & $200.;
year=prxchange('s/.*\s(\S+\s?)(?=YR|YEAR).*/$1/',-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 ;

答案 1 :(得分:0)

丑陋,但有效。

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 ;