【问题标题】:Using "fread", how to eliminate comment line from csv?使用“fread”,如何从 csv 中消除注释行?
【发布时间】:2019-08-29 06:52:35
【问题描述】:

我必须阅读一个 CSV 文件,其中包含一些注释行(以 # 开头)以及数据行。 fread函数用于读取这个CSV文件。

config <- fread("Configuration.csv")

在此文件中,行数不固定,可能会更改。如何在没有这些注释行的情况下阅读 CSV。

提前致谢!!!

【问题讨论】:

  • 显然,fread 没有用于您的目的的 comment.char 参数。 base read.csv 和类似的函数都有它。要么使用read.table,要么使用fread,阅读所有行,然后删除它们。

标签: r csv comments fread


【解决方案1】:

您可以尝试在之前使用 grep 清理数据,而不是之后:

config <- fread("grep -v '^#' Configuration.csv")

更新:

如果使用 fread() 的目的只是将数据转换为 data.table,则可以使用 read.table() 代替默认的 comment.char="#",然后将结果转换为 data.table:

config <- as.data.table(read.table(header = TRUE, "Configuration.csv"))

【讨论】:

  • 如果想坚持使用fread,我想这是唯一的方法。不幸的是,它可能无法移植,因为它依赖于 shell 命令。
  • 是的,这个版本依赖于系统命令。目的是最小化所需的 RAM 大小。
【解决方案2】:

更新答案

我假设您使用的是 Windows...如果是这样,您可以将结果从 findstr 提供给 fread()。
口头回答中的数据保存到test.csv。

data.table::fread( cmd = 'findstr "^[^#]" test.csv', sep = "\n", header = FALSE )

#                V1
#1:  line,with,data
#2: line2,with,data

findstr /b /v test.csv 给出相同的结果

在 linux 上,您可以(可能)将grep 命令的输出传递给fread()。

旧答案

这个解决方案在只处理一个文件时不是很有帮助,但在使用lapply()读取多个文件时会有所帮助

text = "line,with,data
#commentline,with,data
line2,with,data"

data.table::fread( text, sep = "\n", header = FALSE )[!grepl( "^#", V1 )]

【讨论】:

  • @RonakShah 查看“真实”解决方案的更新答案,该解决方案在将结果传递给 fread 之前过滤文件。
  • 正如我在另一个答案中所说,如果想要坚持使用 fread,使用一些 shell 命令可能是唯一的方法。另一方面,使用 shell 命令是一种不好的做法,因为这会使您的代码不可移植。
猜你喜欢
  • 1970-01-01
  • 2010-10-27
  • 2021-12-29
  • 2016-06-25
  • 1970-01-01
  • 1970-01-01
  • 2011-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多