2017-12-27 641 views
2

我想使用fread函數讀取多個文件(csv)。但最後一行我有不必要的數據,我無法使用fread,因爲它會拋出一個錯誤。如何讀取R中的多個csv文件,並使用fread函數跳過最後一行

代碼:

library(data.table)  
fnames <- list.files("Path",pattern = "^.*Star.*.csv$",full=TRUE) 

    read_data <- function(z){ 
     dat <- fread(z, verbose = TRUE, nrow= -1) 
    } 

    datalist <- lapply(fnames, fread) 

    bigdata <- rbindlist(datalist, use.names = TRUE) 

錯誤:收捲過程中

錯誤:預期SEP( ''),但新的線,EOF(或其他非打印字符)從檢測類型時結束字段4點10:2704,IE,N,ENDOFFILEMARKER,5397786

我在每個文件的最後有一行數據ENDOFFILEMARKER。

注:


  • 我需要用FREAD爲每個數據文件的大小約爲700 MB。

+1

請參閱[this](https://stackoverflow.com/q/36558437/1270695)或許,特別是評論。 – A5C1D2H2I1M1N2O1R2T1

+2

現在的一般建議似乎是'fread(「head -n-1 filename.csv」)'。 – A5C1D2H2I1M1N2O1R2T1

+0

我可以使用這些來循環運行嗎? – dharma

回答

1

沒有看到您的CSV文件,所以很難確定最佳答案。也許嘗試使用fread首先閱讀一個文件。使用這樣的事情可能工作:

dat <- fread("grep -v ENDOFFILEMARKER filename.csv") 

其中filename.csv是放在你的工作目錄中的文件之一的名稱。 -v使grep返回除包含字符串ENDOFFILEMARKER的行之外的所有行。如果你可以使用一個文件來處理它,那麼你可以使用lapply來對所有文件應用類似的邏輯。

另一個對我有用的選項是使用readLines函數。缺點是readLines函數有點慢。但是,如果你無法找到另一種方式,那麼readLines將起作用。下面是我基本上是如何使用的一個文件:

length_a <- length(readLines("filename.csv")) 
dt <- fread("filename.csv", nrows = length_a-1) 

一旦你有工作的一個文件,然後你可以弄清楚如何與您的所有文件循環使用。

據我所知,fread("head -n -1 filename.csv")是跳過最後一行的普遍接受的方法,但我從來沒有能夠得到它正常工作。

編輯:如果您使用的是Windows,這可能會爲你工作:

dat <- fread('findstr /V /C:"ENDOFFILEMARKER" filename.csv') 

grep的效果很好,如果你使用的是Linux或安裝了Windows計算機上的Linux工具。如果您使用Windows,findstr命令與Linux中的grep命令類似。/V返回除ENDOFFILEMARKER行之外的所有行。/C:「......」允許精確地匹配多個單詞,包括空格或只是一個單詞。

相關問題