将xlwt生成的Excel文件导入SAS

1 投票
1 回答
564 浏览
提问于 2025-04-17 18:23

我用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。

撰写回答