【问题标题】:read.xls() from gdata package fails with "no lines available in input"gdata 包中的 read.xls() 失败,“输入中没有可用的行”
【发布时间】:2012-05-12 01:47:00
【问题描述】:

我正在使用 gdata 包中的 read.xls() 来阅读 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。 Grothendieck 的建议并获得以下信息。

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

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

我还按照@Joran 的建议在 Libre Office 中将 .xls 文件转换为 .csv 文件,它转换和读取都很好(即,它在所有 236 行和逻辑 readLines() 输出中计算了 27 个字段)。


更新 2

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

【问题讨论】:

  • 没有 xls 文件就无法判断。我在您的未来看到了一些宝贵的时间来寻找隐藏在 xls 文件中某处的不寻常字符。第一步可能是将其导出为 csv,然后尝试将其读取到 R 中,或者在文本编辑器中打开它并直观地扫描它是否有任何异常。
  • @joran -- 感谢您的指点!我在 Libre Office 中将 .xls 转换为 .csv 并完成转换,我可以使用 read.csv() 读取并获取所有行和列的逻辑条目。我可能手动将所有 .xls 转换为 .csv :(.

标签: r


【解决方案1】:

试试这个,看看它是否有什么建议:

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

【讨论】:

  • 感谢您的指点和新工具!我更新了我的问题,看起来xls2csv() 生成了一个空的 .csv 文件。但现在我不明白为什么会出现奇怪的readLines() 错误(即关于第 161 行和第 13 列)。
  • 我使用了命令行 LibreOffice 解决方案,但这是解决问题的最佳方法(这里我认为是因为,由于某种原因,Perl 脚本无法转换 .xls 文件,虽然 LibO 可以)。谢谢!
【解决方案2】:

就我而言,我认为问题在于 .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"

【讨论】:

    【解决方案3】:

    使用 XLConnect !

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

    【讨论】:

    • 在使用 count.fieldsxls2csv 的方法对于多页 *.xlsx 文件失败后,read.xlsx 继续返回“没有可用的行输入”错误(尽管有可用的行),我尝试了这种方法,结果很好!
    猜你喜欢
    • 2014-06-25
    • 2018-07-17
    • 2018-10-05
    • 2020-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多