我的大部分数据都是以固定宽度格式读取的,例如fixedwidth.txt:
00012000ABC
0044500DEFG
345340000HI
00234000JKL
06453MNOPQR
前5个字符为colA,后6个字符为colB。读取该代码的代码类似于:
infile "&path.fixedwidth.txt" lrecl = 397 missover;
input colA $5.
colB $6.
;
label colA = 'column A '
colB = 'column B '
;
run;
但是我的某些数据来自其他地方,并且被格式化为csv,且没有前导零,例如example.csv:
colA,colB
12,ABC
445,DEFG
34534,HI
234,JKL
6453,MNOPQR
由于将csv数据添加到从固定宽度文件读取的现有数据中,因此我想完全匹配格式。
到目前为止,我在example.csv中阅读的代码是:
data work.example;
%let _EFIERR_ = 0; /* set the ERROR detection macro variable */
infile "&path./example.csv" delimiter = ',' MISSOVER DSD lrecl=32767 firstobs=2 ;
informat colA $5.;
informat colB $6.;
format colA z5.; *;
format colB z6.; *;
input
colA $
colB $
;
if _ERROR_ then call symputx('_EFIERR_',1); /* set ERROR detection macro variable */
run;
但是格式为z5。 &z6。仅适用于格式化为数字的列,因此它不起作用并提供以下输出:
ColA colB
12 ABC
445 DEFG
34534 HI
234 JKL
6453 MNOPQR
我想要的时候:
ColA colB
00012 000ABC
00445 00DEFG
34534 0000HI
00234 000JKL
06453 MNOPQR
两列均设置为字符。
理想情况下,我想找到一种仅使用格式和informats来获得所需输出的方法,以使代码易于理解(我有很多专栏来跟踪!)。
感谢任何建议!
答案 0 :(得分:0)
您可以使用cats
强制将csv列设置为字符,而无需知道csv导入确定的类型。正确地将结果证明为预期的或所需的可变长度,并将填充的空间转换为零。
例如
data have;
length a 8 b $7; * dang csv data, someone entered 7 chars for colB;
a = 12; b = "MNQ"; output;
a = 123456; b = "ABCDEFG"; output;
run;
data want;
set have (rename=(a=csvA b=csvB));
length a $5 b $6;
* may transfer, truncate or convert, based on length and type of csv variables;
* substr used to prevent blank results when cats (number) is too long;
* instead, the number will be truncated;
a = substr(cats(csvA),1);
b = substr(cats(csvB),1);
a = translate(right(a),'0',' ');
b = translate(right(b),'0',' ');
run;
答案 1 :(得分:0)