我有一个 Excel 文件,其中有一列格式为“常规”。它保存数值,但我希望将其作为文本导入。
当我使用时:
PROC IMPORT OUT= test DATAFILE= "C:\file"
DBMS=xlsx REPLACE;
GETNAMES=YES;
RUN;
有时以数字形式导入,有时以文本形式导入。我怎样才能始终将其导入为文本?我在 Windows 7 和 Excel 2010 上使用 sas 9.4。
即使这不起作用......它也不会改变数据类型:
PROC IMPORT OUT= test DATAFILE= "C:\data.xlsx"
DBMS=excel REPLACE;
DBDSOPTS= "DBTYPE=(Employee_No='CHAR(3)')";
GETNAMES=YES;
RUN;
这是使用 PCFILES 方法而不是 XLSX 来完成此操作的一种方法。
libname test pcfiles path= 'c:\_localdata\demo.xlsx';
data want;
set test.'Sheet1$'n (dbsastype=Random=char8);
run;
libname test;
如果您的文件是 XLS 而不是 XLSX,SAS 会保留 Excel 文件中的列格式。
PROC IMPORT OUT=test DATAFILE= "C:\myfile.xls"
DBMS=EXCELCS REPLACE;
GETNAMES=YES;
RUN;
如果您在 Excel 文件中将列格式设置为文本,那么在 SAS 数据集中它将是文本(字符),即使它们看起来像数字。
请注意,此功能需要安装
PC Files Server
。请参阅PC 文件的 SAS/ACCESS
第一个评论是,在 Excel 电子表格中,每个单元格都是独立“格式化”的。 但在数据集中,变量的所有值必须使用相同的类型(数字或字符)。 因此,当 SAS 从混合有数字和字符单元格的电子表格中导入列时,它必须决定要创建什么类型的变量。 它将使其成为字符,因为您可以将数字转换为数字字符串,但不能将所有字符串转换为数字。
第二条评论是,如果您导入完全相同的电子表格两次,您将得到完全相同的结果。 所以我假设您的意思是,当您导入不同的电子表格时,有时相关列会被制成字符变量,而有时它会被制成数字变量。 这是因为不同的电子表格的单元格中具有不同的信息。
如果您的列标题是字符单元格,那么强制 PROC IMPORT 使变量字符的最简单方法是使用 GETNAMES=No 以便包含标题单元格。 然后,您可以删除第一个观察并使用它来重命名变量。
PROC IMPORT DATAFILE= "C:\file.xlsx" DBMS=xlsx
OUT=fullsheet REPLACE
;
GETNAMES=No;
RUN;
PROC TRANSPOSE data=fullsheet(obs=1) out=names;
var _all_;
run;
PROC SQL noprint;
select catx('=',_name_,nliteral(col1)) into :renames separated by ' '
from names;
QUIT;
data want;
set fullsheet(firstobs=2);
rename &renames;
run;