我在SAS中使用'压缩'功能时遇到了一些麻烦。我的目的是从此数据步骤中的“注释”字段中删除任何字母字符。
但是,当我执行下面的代码时,'NewPrice'字段显示FALSE而不是预期值。
data WORK.basefile2;
length TempFileName Filenameused $300.;
%let _EFIERR_ = 0; /* set the ERROR detection macro variable */
infile CSV2 delimiter = ',' MISSOVER DSD lrecl=32767 firstobs=3 Filename=TempFileName;
Filenameused= TRANWRD(substr(TempFileName, 48), ".xlsx.csv", "");
informat customer_id $8.;
informat Name $50.;
informat Reco_issue $50.;
informat Reco_action $50.;
informat ICD $50.;
informat Start_date $50.;
format customer_id $8.;
format Name $50.;
format Reco_issue $50.;
format Reco_action $50.;
format ICD $50.;
format Start_date $50.;
format Comments $255.;
format Description $255.;
NewPrice=COMPRESS(Comments, '', 'kd');
input
customer_id $
Name $
'Total Spend'n $
Template $
Product_id $
Description $
Start_date $
CD_Sales
CD_Lines
CD_Level $
CD_Price $
CD_uom $
CD_Discount $
Reco_issue $
Reco_action $
Reco_price $
Reco_discount $
Impact_£
Impact
Agree $
Comments $
ICD $
Structure_Code $
Deal_type $
NewPrice;
run;
示例数据(以逗号分隔):
ASDFGH,TEST,“31,333.00英镑”,15AH,156907,TEST,2016年8月18日,“£4,003.10”,222,5,£5.19,M ,,低于硬地板,变化率,£6.63 ,, £0.48,21.72%,N,与客户就新价格进行谈判 ASDFGH,TEST,“31,333.00英镑”,15AH,475266,TEST,2016年11月11日,49.61,29,5英镑,2.52英镑,EA,硬底,变动率,£6.36 ,,£1.28,60.38% ,N,在与客户谈判新价格时 ASDFGH,TEST,“£31,333.00”,15AH,404740,TEST,21/09/2017,£38.69,1,5,£116.07,EA ,,低于硬地板,变动率,£163.80 ,,£15.91,29.14% ,N,在与客户谈判新价格时 ASDFGH,TEST,“£31,333.00”,15AH,476557,TEST,2016年11月11日,£32.13,25,5,£1.32,EA ,,低于硬地板,变动率,£2.76 ,,£0.48,52.17% ,N,在与客户谈判新价格时 ASDFGH,TEST,“£31,333.00”,15AH,476553,TEST,2016年11月11日,£29.17,11,5,£1.29,EA ,,低于硬地板,变动率,£3.39 ,,£0.70,61.95% ,N,在与客户谈判新价格时 ASDFGH,TEST,“£31,333.00”,15AH,476557,TEST,2016年11月11日,£17.61,5,5,£3.96,EA ,,低于硬地板,变动率,£9.69 ,,£1.91,59.13% ,N,在与客户谈判新价格时 ASDFGH,TEST,“£31,333.00”,15AH,475261,TEST,2016年11月11日,£16.70,4,5,£10.92,EA ,,低于硬地板,变动率,£26.67 ,,£5.25,59.06% ,N,在与客户谈判新价格时 ASDFGH,TEST,“31,333.00英镑”,15AH,476546,TEST,2016年11月11日,15.73,10,5英镑,0.96英镑,EA,低于硬地板,变动率,£2.67 ,,£0.57,64.04% ,N,在与客户谈判新价格时 ASDFGH,TEST,“£31,333.00”,15AH,476549,TEST,2016年11月11日,£5.84,3,5,£1.86,EA ,,硬地板,变动率,£6.00 ,,£1.38,69.00% ,N,在与客户谈判新价格时 ASDFGH,TEST,“£31,333.00”,15AH,477340,TEST,2016年11月11日,£3.75,2,5,£4.11,EA ,,低于硬地板,变动率,11.40英镑,£2.43,63.95% ,N,在与客户谈判新价格时 ASDFGH,TEST,“£31,333.00”,, 259738,TEST,13/01/2018,“£45,173.66”,403,5,£10.35,EA,20,低于硬地板,变动率,£10.80 ,,£0.15, 4.17%,N,新价格同意£3.52 ASDFGH,TEST,“£31,333.00”,, 297622,TEST,13/01/2018,£736.60,5,5,£10.95,EA,20,低于硬地板,变动率,11.46英镑,£0.17,4.45% ,N,新价格同意£3.75 ASDFGH,TEST,“£31,333.00”,, 105384,TEST,19/07/2017,£223.44,1,5,£11.25,BG,42.5,Hard Floor,更改,11.49英镑,£0.08,2.09% ,N,新价格同意£3.76
非常感谢任何帮助!
谢谢,
亨利
答案 0 :(得分:0)
首先,我认为你的意思是NEWPRICE=' '
,而不是FALSE
,因为SAS本身并没有“假”。但是,' '
在布尔表达式中将被视为FALSE
。
COMPRESS
在此处返回' '
,因为COMMENTS
中的值完全包含字母字符。你的COMPRESS
参数要求它保留数字和空格(''
仍然是一个空格,即使它看起来不像 - 如果你不想要空格,请将参数保持为空) ,这意味着它只会保留空格和数字。对于大多数记录,COMMENTS
字段中没有数字,因此您只有空格,被视为等同于SAS缺失的空格。
其他记录,你有问题,你要保留空格,所以它不会整齐地变成一个数字。您将需要使用input
,并且可能不保留空格,以获得所需的值。 (您也可能希望保留.
,不是吗?)或者将NEWPRICE
作为字符字段。
最后,你的行:
NewPrice=COMPRESS(Comments, '', 'kd');
是之前输入语句,这是一个问题 - comments
的值在运行时尚未定义。
例如,这有效。注意我不明白为什么你在输入中列出NewPrice
(以及其他一些也没有定义的字段)......
data WORK.basefile2;
%let _EFIERR_ = 0; /* set the ERROR detection macro variable */
infile datalines delimiter = ',' MISSOVER DSD ;
informat customer_id $8.;
informat Name $50.;
informat Reco_issue $50.;
informat Reco_action $50.;
informat ICD $50.;
informat Start_date $50.;
format customer_id $8.;
format Name $50.;
format Reco_issue $50.;
format Reco_action $50.;
format ICD $50.;
format Start_date $50.;
format Comments $255.;
format Description $255.;
input
customer_id $
Name $
'Total Spend'n $
Template $
Product_id $
Description $
Start_date $
CD_Sales
CD_Lines
CD_Level $
CD_Price $
CD_uom $
CD_Discount $
Reco_issue $
Reco_action $
Reco_price $
Reco_discount $
Impact_Pound
Impact
Agree $
Comments $
ICD $
Structure_Code $
Deal_type $
;
NewPrice=input(COMPRESS(Comments, '.', 'kd'),best32.);
datalines;
ASDFGH,TEST,"£31,333.00",15AH,156907,TEST,18/10/2016,"£4,003.10",222,5,£5.19,M,,Below Hard Floor,Change Rate,£6.63,,£0.48,21.72%,N,New Prices Agreed £3.76
ASDFGH,TEST,"£31,333.00",15AH,475266,TEST,11/11/2016,£49.61,29,5,£2.52,EA,,At Hard Floor,Change Rate,£6.36,,£1.28,60.38%,N,In negotiations with the customer for new prices
ASDFGH,TEST,"£31,333.00",15AH,404740,TEST,21/09/2017,£38.69,1,5,£116.07,EA,,Below Hard Floor,Change Rate,£163.80,,£15.91,29.14%,N,In negotiations with the customer for new prices
;;;;
run;