我使用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.
答案 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。