使用"fread",如何从CSV文件中删除注释行?

4

我需要读取一个CSV文件,该文件包含一些注释行(以#开头)和数据行。使用fread函数读取此CSV文件。

config <- fread("Configuration.csv")

CSV文件快照

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

提前致谢!


1
显然,fread没有适用于您目的的comment.char参数。 base中的read.csv和类似函数具有此功能。您可以使用read.table或使用fread读取所有行,然后再将其删除。 - nicola
2个回答

5

在之前而不是之后使用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命令。 - nicola
1
是的,这个版本依赖于系统命令。目标是尽可能减少所需的RAM大小。 - Grzegorz Sionkowski
fread类似于read.table,但速度更快,更方便。 - Matthias Munz

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 )]

1
@RonakShah 请查看更新后的答案,其中包含一个“真正”的解决方案,该解决方案在将结果传递给fread之前过滤文件。 - Wimpel
正如我在另一个答案中所说,如果想要坚持使用fread,使用一些shell命令可能是唯一的方法。另一方面,使用shell命令是不好的做法,因为会使你的代码不具备可移植性。 - nicola

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接