1

我使用 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.
4

1 回答 1

2

如果在 Excel 中打开工作簿并保存它允许 SAS 正确导入它,这将表明(对我而言)存在一些缺陷xlxt(我一无所知的过程)。由于 Excel 工作簿的类型很多,将 Excel 文件导入 SAS 是一个复杂的主题。

直接读取 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。

于 2013-03-08T16:15:21.473 回答