tranwrd没有正确替换并截断目标字符串

时间:2017-10-17 14:48:00

标签: sas

我用'01 \ 12 \ 17'替换目标字符串'01 -DIC-17',然后用输入函数将其转换为sas date,但输出为'01 \ 12 \'。截断'\ 17'。

DATA SAS是:

data test;
input issueDate $10. lastDate $10.;
datalines;
05-DIC-16 04-ENE-17
05-DIC-16 04-ENE-17
05-DIC-16 04-ENE-17
05-DIC-16 20-ENE-17
05-DIC-16 20-ENE-17
05-DIC-16 04-ENE-17
05-DIC-16 20-ENE-17
05-DIC-16 04-ENE-17
05-DIC-16 20-ENE-17
;
run;

我有一个调整月份表:

DATA ADJUST_MONTH;
INPUT TARGET $ REPLACEMENT $;
DATALINES;
-ENE- /01/
-FEB- /02/
-MAR- /03/
-ABR- /04/
-MAY- /05/
-JUN- /06/
-JUL- /07/
-AGO- /08/
-SEP- /09/
-OCT- /10/
-NOV- /11/
-DIC- /12/
;
RUN;

运行代码:

 proc sql;
 update test
 set issueDate = TRANWRD(issueDate,substr(issueDate,3,5),(select replacement from adjust_month where target eq substr(issueDate,3,5)));quit;

输出:IssueDate:'05 -DIC-16'convert for IssueDate:'05 / 12 /'

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

您的Trim列包含尾随空格。 trim((select replacement from adjust_month where target eq substr(issueDate,3,5)))或类似功能会对您有所帮助。例如,将pw

替换为嵌套选择

答案 1 :(得分:0)

您无需在代码中进行所有转换。您可以使用相关的语言日期信息直接读取数据。在您的情况下,它是西班牙语,因此espdfde9.信息将源数据作为日期(使用input函数)读取,然后您可以随意使用它。

我会创建额外的列来存储这些日期,而不是更新exisitng列,因为日期通常更好地存储为数字而不是字符。但这是你的选择。

要使用此信息,您的SAS安装必须加载欧洲字符集和编码。

data test;
input issueDate $10. lastDate $10.;
datalines;
05-DIC-16 04-ENE-17
05-DIC-16 04-ENE-17
05-DIC-16 04-ENE-17
05-DIC-16 20-ENE-17
05-DIC-16 20-ENE-17
05-DIC-16 04-ENE-17
05-DIC-16 20-ENE-17
05-DIC-16 04-ENE-17
05-DIC-16 20-ENE-17
;
run;


data want;
set test;
issuedate_new = input(issuedate, espdfde9.);
lastdate_new = input(lastdate, espdfde9.);
format issuedate_new lastdate_new date9.;
run;