r - 如何在R中读取多个csv文件并使用fread函数跳过最后一行

标签 r csv data.table fread

我正在尝试使用 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。

笔记:

  • 我需要使用 fread,因为每个数据文件大约 700 MB。
  • 最佳答案

    如果没有看到您的 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/

    相关文章:

    r - 用 dplyr 列出 sqlite 表?

    java - 正则表达式查找分隔符之间包含的字符串

    sql-server - 如何使用bcp将sql数据导出到csv

    r - 根据规则对用户进行聚类或分桶

    r - 我可以避免向量中的操作的 for 循环吗?

    r - 使用 R 中的 read.table 按日期分解百分位数据

    r - 按元素的总和/平均值过滤行

    r - 是否有一个 R 相当于 bash 命令?

    r - 在等长的 bin 中划分一系列值 : cut vs cut2

    java - 将 sql ResultSet 写入 csv 文件