2017-12-27 501 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:“......”允许精确地匹配多个单词,包括空格或只是一个单词。

相关问题