我正在使用下面提供的宏来导入几个效果很好的csv文件。但是,在导入之前,我很难将数据集中的第3列和第6列从列转换为行。然后,我想将这些列分别重命名为日期和学习。
(例如,现在每个文件在第3列中都有不同的日期作为列名,我想将其移至该行并为该列取一个新名称,即日期,以便在我设置所有导入文件时下方的所有其他内容都将在名为WKWebView
的列中
我不知道每个文件中第3列的名称。因此,例如在文件1中,它可以在文件2中分别命名为date
和XYZ
,而我想同时命名为YYX
和date
和XYZ
代替排。示例如下:
在文件1中:
YYX
在文件2中:
| Pt | Rt | XYZ |
|----|----|------|
| 1 | 2 | |
结果应如下所示:
| Pt | Rt | YYZ |
|----|----|------|
| 3 | 4 | |
代码:
| Pt | Rt | date |
|----|----|-------|
| 1 | 2 | XYZ |
| 3 | 4 | YYX |
代码最初来自:https://github.com/statgeek/SAS-Tutorials/blob/master/Import_all_files_one_type
Edit1 :如第一条评论中所述。
Edit2 :添加了指向代码源的链接。
答案 0 :(得分:1)
为什么不只用一个数据步就完成整个过程? SAS可以直接读取CSV文件,而无需使用PROC IMPORT。
在文件名中使用通配符一次读取所有文件。 当您位于文件的第一行时,请从标题行中读取日期。
%let path=C:\Users\baidw002\Documents\1 BCH-LJAF\Real data transfer (BCH to UAB)\CGM\cgmtestfiles\machine\csv;
data want ;
length pt 8 rt 8 date 8 ;
informat date anydtdte.;
format date yymmdd10.;
length dummy $1 fname $256;
infile "&path/*.csv" filename=fname truncover dsd ;
input @;
if fname ne lag(fname) then do;
input 2*dummy date ;
retain date;
end;
input pt rt ;
drop dummy;
run;
所以,如果我组成一些虚拟文件:
%let path=%sysfunc(pathname(work));
data _null_;
file "&path/test1.csv";
put 'pt,rt,3/4/19' / '1,2';
file "&path/test2.csv";
put 'pt,rt,4/5/19' / '3,4';
run;
我得到这个结果:
Obs pt rt date
1 1 2 2019-03-04
2 3 4 2019-04-05