2012-05-12 25 views
1

我使用gdata包中的read.xls()來讀取其中每個工作簿都有一個工作表的Excel工作簿。讀取失敗,出現以下錯誤。gdata包中的read.xls()失敗,輸入中沒有可用的行

> 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行和邏輯readLines()輸出中統計27個字段)。


更新2

我要補充一點,我覺得這些.xls文件是不會用Excel生成(我的源是關於其起源有點遮遮掩掩),但我不當我在Libre Office中打開它們時,會收到任何錯誤或警告。

+2

不可能告訴沒有xls文件。我將在未來看到一些高質量的時間尋找隱藏在xls文件某處的不尋常字符。第一步可能是將一個導出爲csv,然後嘗試將其讀入R,或者在文本編輯器中將其打開,並以可視方式掃描它以尋找任何不尋常的東西。 – joran

+0

@joran - 感謝指針!我將.xls轉換爲Libre Office中的.csv文件,轉換過程可以通過'read.csv()'讀取並獲取所有行和列的邏輯條目。我可能會手動將所有.xls轉換爲.csv :(。 –

回答

1

試試這個,看看它是否暗示什麼:

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

感謝您的指針和新工具!我更新了我的問題,它看起來像'xls2csv()'生成一個空的.csv文件。但現在我無法理解爲什麼我得到奇怪的'readLines()'錯誤(即,關於第161行和第13列) –

+0

我使用命令行LibreOffice解決方案,但這是解決問題的最佳方法(這裏我認爲這是因爲,由於某些原因,Perl腳本無法轉換.xls文件,雖然LibO可以)。謝謝! –

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" 
1

使用XLConnect!

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

在使用'count.fields'和'xls2csv'的方法失敗後,多張_ *。xlsx_文件和' read.xlsx'繼續返回一個「沒有行可用的輸入」錯誤(雖然有可用的行),我試過這種方法,它只是工作得很好! – fdetsch

相關問題