将 xlwt 生成的 excel 文件导入 SAS

Posted

技术标签:

【中文标题】将 xlwt 生成的 excel 文件导入 SAS【英文标题】:Importing xlwt generated excel files into SAS 【发布时间】:2013-02-23 20:40:42 【问题描述】:

我使用 xlwt 将一堆 csv 文件转换为 excel 文件。 之后我需要将这些excel文件导入SAS(统计软件)。

在第一次尝试时,SAS 抛出一个错误,指出文件格式无效。

但是当我只是用 MS Excel 打开任何生成的文件并关闭而不做任何更改并且不保存文件时,文件会成功导入 SAS。

我发现 MS Excel 更改了文件头,在其中添加了当前用户名并更新了文件修改日期。

我想知道是否有可能在保存之前修改excel文件二进制头。

更新: 我正在使用 xlwt 0.7.4 版, 蟒蛇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.

【问题讨论】:

您如何使用 SAS 访问 Excel 文件?即:ODBC 扩展(注意 - 自 2004 年以来我没有使用过 SAS!) 顺便说一句 - 您最好将 CSV 数据导入 SAS 感谢您的回复。实际上,统计学家正在使用 SAS,正如他们所描述的导入 csv 文件的问题是 SAS 根据 CSV 文件的第一个原始文件设置字段大小。如果文档稍后在此字段中有较长的字符串,SAS 处理它们时会出现问题。如我所见,使用 SAS 查询语言导入 Excel 文件。不过不确定我的定义是否正确。 我相信可以显式设置长度(即 $char100。)...如果不是 - 另一种选择是将 CSV 转换为固定长度记录,并生成一些适合的代码在infile/input 声明中使用...(就像我说的,不过我生疏了)-如果xlwt 有问题,那么它也有自己的邮件列表,以及项目响应,所以这可能值得考虑...... 嗨,我是 xlwt 维护者。您能否引用从 SAS 获得的确切错误消息?你用的是什么版本的 xlwt?请显示您为将 CSV 文件转换为 XLS 文件而编写的代码。请显示一个导致问题的小(2 或 3 行)csv 文件。 【参考方案1】:

如果在 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。

【讨论】:

绝对走 CSV 路线。转换为 Excel 以将其转换为 SAS 就像在吃香蕉之前将其腐烂。 SAS 使用 CSV 格式的效果要比使用 excel 好得多。您也可以手写输入代码,而不是使用 PROC IMPORT;那么你可以直接指定每一列的格式/长度。 谢谢!看起来是一个很好的解决方案。我和统计学家谈过,他们没有使用“guessingrows”参数。等待他们的更新。

以上是关于将 xlwt 生成的 excel 文件导入 SAS的主要内容,如果未能解决你的问题,请参考以下文章

将数据从excel导入SAS

怎么用python语言将txt文件的内容,导入excel中??

python如何将txt文件导入excel

用faker和xlwt创建一个假信息库导入excel用于测试

django excel xlwt

SAS中数据的导入(1)