将xlwt生成的excel文件导入SAS

时间:2013-03-08 10:21:23

标签: python excel sas xlwt

我使用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 个答案:

答案 0 :(得分: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。