【发布时间】:2014-08-30 20:17:42
【问题描述】:
我正在尝试导入一个大型 CSV 文件(大约 7k 个变量和 355 个观察值)。 Proc Import 在 ~2k 列之后停止读取变量名,我不太确定为什么。我发现使用 infile 会让我将整个 csv 导入 SAS,但变量名在第一行,并且变量名为 v1-vn。我只需要从第一行中获取变量名称,然后使用它们修改/重命名我的数据集。
到目前为止,我有: 使用 infile 和 transpose 将我的所有变量名称放入单独数据集中的一列中。 使用 proc sql 将此列选择到列表中。 使用宏和此列表将我的头撞在键盘上一天半,以尝试修改原始变量名称。
我在最近(不成功)的尝试中使用了以下代码。请记住,对于大约 7k 变量,我无法手动重命名它们,甚至无法重命名其中的一小部分。我需要以某种方式使用 do 循环或宏来执行此操作,或者让 infile 正确读取变量名。
data LabImportRaw;
length v1-v6876 $300;
infile 'C:\xxxxxxxxxxxx\LabImportListing.csv' delimiter=',' firstobs=2 missover lrecl=250000;
input v1-v6876 ;
run;
data LabImportVNames;
length v1-v6876 $300;
infile 'C:\xxxxxxxxxx\LabImportListing.csv' delimiter=',' obs=1 missover lrecl=250000;
input v1-v6876 ;
Array VNames(6876) v1-v6876;
run;
proc transpose
data=LabImportVNames
Out=LabImportVNames;
var v1-v6876;
run;
*Create a list of new variable names;
proc sql;
select Col1
into :renamelist
from LabImportVNames;
quit;
*Create Rename Macro;
%macro rename(oldvarlist, newvarlist);
%let k=1;
%let old = %scan(&oldvarlist, &k);
%let new = %scan(&newvarlist, &k);
%do %while(("&old" NE "") & ("&new" NE ""));
rename &old = &new;
%let k = %eval(&k + 1);
%let old = %scan(&oldvarlist, &k);
%let new = %scan(&newvarlist, &k);
%end;
%mend;
*Do the renames;
proc datasets lib=work;
modify LabImportRaw;
%rename(v1-v6786, renamelist)
run;
【问题讨论】: