来自gdata包的read.xls()失败,“输入中没有可用的行”

时间:2012-05-12 01:47:01

标签: r

我正在使用read.xls()包中的gdata来阅读Excel工作簿,其中每个工作簿都有一个工作表。读取失败,出现以下错误。

> read.xls(list.files[[1]])
Error in read.table(file = file, header = header, sep = sep, quote = quote,  : 
  no lines available in input

我无法弄清楚错误。 sheetCount()会返回以下错误。

> sheetCount(list.files[[1]])
Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  : 
  line 161 did not have 13 elements

但这很奇怪,因为工作簿有27列。对于行161 +/- 1或列13 +/- 1,似乎没有什么不寻常的。

在整个工作簿中,重复的条目都是空白的,您需要手动将它们向下扩展(这对于我想阅读的750多个工作簿来说是不切实际的)。

我尝试手动设置quote=''quote='\'',但这些不会更改输出。我的问题是read.xls()看到某些行是褴褛而不是其他行?有什么指针吗? (我尝试了xlsReadWrite包,但我使用的是64位Win 7,它只适用于32位系统。)

谢谢!


更新

我跟着@G。格洛腾迪克的建议并得到以下内容。

> k <- count.fields(xls2csv(list.xls[[1]]), sep = ","); k
NULL
> L <- readLines(xls2csv(list.xls[[1]])); L
character(0)

xls2csv()生成的临时文件为空,所以现在我无法弄清楚为什么我的countSheets()调用会返回“第161行,第13列”错误。

我也关注了@Joran的建议并将.xls文件转换为Libre Office中的.csv文件,它转换并读取就好了(即,它计算了所有236行中的27个字段和逻辑readLines()输出)


更新2

我应该补充一点,我认为这些.xls文件不是由Excel生成(我的来源对它们的来源有点保密),但我不知道在Libre Office中打开它们时会收到任何错误或警告。

3 个答案:

答案 0 :(得分:1)

试试这个,看看它是否暗示:

library(gdata)
k <- count.fields(xls2csv("myfile.xls"), sep = ","); k
L <- readLines(xls2csv("myfile.xls")); L

答案 1 :(得分:1)

在我的情况下,我认为问题是.xls到.csv Perl脚本失败(这是gdata使用的)。我仍然不确定为什么因为LibreOffice将.xls转换为.csv而没有任何警告。我用Vim检查了.csv它看起来很正常(即没有疯狂的字符)。我认为.xls由一些专有脚本很难形成,所以Perl脚本失败了。

因为LibreOffice在这里工作,最简单的解决方案是使用命令行LibreOffice(即,不使用基于Perl的工具)。我在Win7上,所以我写了一个简单的.bat文件来转换目录中的每个.xls。

for %%f in (*.xls) do soffice.exe -invisible -convert-to csv "%%f"

答案 2 :(得分:1)

使用XLConnect!

library(XLConnect)
readWorksheetFromFile(list.files[[1]], 1, useCachedValues=TRUE)