如何在SAS中导入包含重复列名的csv文件

如何在SAS中导入包含重复列名的csv文件,sas,Sas,我想在SAS中导入具有重复列名的CSV文件。范例 名称abc def def 是我的文件中的列名 当我尝试在SAS中导入文件时,它会自动将变量重命名为var1、var2等 我想保留原来的列名。如何执行此操作?从中可以看出,您将把变量名放在第一行,并使用GETNAMES=yes proc import datafile="C:\temp\test.csv" out=shoes dbms=csv replace; getnames=yes; run; proc print;

我想在SAS中导入具有重复列名的CSV文件。范例

名称abc def def

是我的文件中的列名

当我尝试在SAS中导入文件时,它会自动将变量重命名为var1、var2等

我想保留原来的列名。如何执行此操作?

从中可以看出,您将把变量名放在第一行,并使用
GETNAMES=yes

proc import datafile="C:\temp\test.csv"
   out=shoes
   dbms=csv
   replace;
   getnames=yes;
run;

proc print;
run;
从中可以看出,您将把变量名放在第一行,并使用
GETNAMES=yes

proc import datafile="C:\temp\test.csv"
   out=shoes
   dbms=csv
   replace;
   getnames=yes;
run;

proc print;
run;

SAS数据集中不能有重复的列名。你必须将它们重命名为某个名称;如果您不喜欢
proc import
正在执行的操作,可以通过
proc数据集
手动重命名它们

proc datasets;
    modify <dataset>;
    rename var1=name var2=abc1 var3=abc2 var4=def1 var5=def2;
quit;
proc数据集;
修改
重命名var1=name var2=abc1 var3=abc2 var4=def1 var5=def2;
退出

SAS数据集中不能有重复的列名。你必须将它们重命名为某个名称;如果您不喜欢
proc import
正在执行的操作,可以通过
proc数据集
手动重命名它们

proc datasets;
    modify <dataset>;
    rename var1=name var2=abc1 var3=abc2 var4=def1 var5=def2;
quit;
proc数据集;
修改
重命名var1=name var2=abc1 var3=abc2 var4=def1 var5=def2;
退出

你可以用几种不同的方法来做。执行示例的最简单方法如下所示:

data want;
infile datalines dlm=',';
input name $ abc1-abc2 def1-def2;
datalines;
John,1,2,3,4
Jack,4,5,6,7
;;;;
run;

proc print data=want;
run;
很明显,1-2可以变成1-35或者其他什么

如果您的数据比这更复杂,使用交错变量,我建议只读取标题行,转置它,然后从中构造输入语句

data varnames; *this dataset reads the header in only - use infile with obs option for actual csv;
input varname $ @@;
order+1; *so we can get back to proper order;
datalines;
Name abc abc def def
;;;;
run;

proc sort data=varnames; *sort by varname;
by varname;
run;

data input_statement;
set varnames;
by varname;
if first.varname then counter=0;
if not (first.varname and last.varname) then do; *if this is not the only varname with same varname;
 counter+1;                          *increment counter;
 varname=cats(varname,counter);      *append counter to varname;
end;
run;

proc sort data=input_statement;   *back to correct order;
by order;
run;

proc sql;   *select the new names into a macro variable;
select varname into :namelist separated by ' ' from input_statement;
quit;

data want;  *input them;
infile datalines dlm=',';
input (&namelist) ($);  *here I just make them all CHAR.  If you have all NUM except the name var, 
                         you could leave name out of your datasets and include it separately.;
datalines;
John,1,2,3,4
Jack,4,5,6,7
;;;;
run;

你可以用几种不同的方法。执行示例的最简单方法如下所示:

data want;
infile datalines dlm=',';
input name $ abc1-abc2 def1-def2;
datalines;
John,1,2,3,4
Jack,4,5,6,7
;;;;
run;

proc print data=want;
run;
很明显,1-2可以变成1-35或者其他什么

如果您的数据比这更复杂,使用交错变量,我建议只读取标题行,转置它,然后从中构造输入语句

data varnames; *this dataset reads the header in only - use infile with obs option for actual csv;
input varname $ @@;
order+1; *so we can get back to proper order;
datalines;
Name abc abc def def
;;;;
run;

proc sort data=varnames; *sort by varname;
by varname;
run;

data input_statement;
set varnames;
by varname;
if first.varname then counter=0;
if not (first.varname and last.varname) then do; *if this is not the only varname with same varname;
 counter+1;                          *increment counter;
 varname=cats(varname,counter);      *append counter to varname;
end;
run;

proc sort data=input_statement;   *back to correct order;
by order;
run;

proc sql;   *select the new names into a macro variable;
select varname into :namelist separated by ' ' from input_statement;
quit;

data want;  *input them;
infile datalines dlm=',';
input (&namelist) ($);  *here I just make them all CHAR.  If you have all NUM except the name var, 
                         you could leave name out of your datasets and include it separately.;
datalines;
John,1,2,3,4
Jack,4,5,6,7
;;;;
run;

当我尝试使用导入向导导入时,运行了与您发布的代码相同的代码,并且它自动重命名了列当我尝试使用导入向导导入时,运行了与您发布的代码相同的代码,并且它自动重命名了列。如果列数过多,然后如何手动重命名它们?是否有任何方法可以让SA为名称为abc的列的重复项添加数字后缀,如abc abc1 abc 2?如果列数过多,然后我如何手动重命名它们?是否有任何方法可以让SA向重复项添加数字后缀,例如abc C1 abc 2,用于名为abc的列?