我正在尝试使用 fread 函数读取多个文件 (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(或其他非打印字符)在从点 10 检测类型时结束字段 4:2704,IE,N,ENDOFFILEMARKER,5397786
我在每个文件的最后一行都有数据 ENDOFFILEMARKER。
笔记:
最佳答案
如果没有看到您的 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')
如果您使用 Linux 或在您的 Windows 机器上安装了 Linux 工具,grep 可以很好地工作。如果您使用的是 Windows,则 findstr 命令类似于 Linux 中的 grep 命令。/V 返回除包含 ENDOFFILEMARKER 的行之外的所有行。/C:"... ..."允许匹配多个单词,包括空格或仅匹配一个单词。
关于r - 如何在R中读取多个csv文件并使用fread函数跳过最后一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47996447/