将xlwt生成的Excel文件导入SAS
我用xlwt把一堆csv文件转换成了excel文件。
接下来,我需要把这些excel文件导入到SAS(统计软件)中。
第一次尝试时,SAS报错说文件格式无效。
但是当我用MS Excel打开任何一个生成的文件,然后直接关闭,不做任何修改,也不保存,结果这个文件就能成功导入到SAS了。
我发现MS Excel会修改文件的头部,添加当前用户名,并更新文件的修改日期。
我在想,是否有办法在保存之前修改excel文件的二进制头部呢。
更新:我使用的xlwt版本是0.7.4,Python版本是2.7.3,SAS版本是9.3,Excel版本是2010,操作系统是Windows 7 32位。
这是我用来把CSV转换成Excel的代码的一部分:
wb = xlwt.Workbook(encoding='latin-1')
ws = wb.add_sheet('Sheet1')
sourceCSV = csv.reader(open(files, 'rb'), delimiter=";")
for rowi, row in enumerate(sourceCSV):
for coli, value in enumerate(row):
ws.write(rowi, coli, value)
wb.save(xls_file)
这里是我在SAS导入函数中使用的选项:
...
DBMS=EXCEL REPLACE;
RANGE="Sheet1$";
GETNAMES=YES;
MIXED=NO;
SCANTEXT=YES;
USEDATE=YES;
SCANTIME=YES;
...
这是SAS产生的错误信息:
ERROR: Connect: External table is not in expected format.
ERROR: Error in the LIBNAME statement.
1 个回答
2
如果在Excel中打开工作簿并保存后,SAS能够正确导入,那就说明可能是xlxt
这个过程有问题(我对此并不太了解)。将Excel文件导入到SAS是个复杂的事情,因为Excel工作簿有很多不同的类型。
直接读取CSV文件会简单很多,这样就可以省去转换成Excel的步骤。当你使用PROC IMPORT来读取CSV文件时,SAS会先检查文件的前几行,以确定每一列的数据类型。默认情况下,SAS只会查看文件的前20行,但你可以通过GUESSINGROWS这个语句来改变这个设置:
proc import datafile="C:\temp\test.csv"
out=mydataset
dbms=csv
replace;
getnames=yes; /* Uses first row in CSV for column names */
guessingrows=32767;
run;
上面是SAS 9.2版本中GUESSINGROWS的最大值;如果你使用的是9.3版本,最大值已经增加到2,147,483,647。