【问题标题】:Scan for string across multiple files with R使用 R 扫描多个文件中的字符串
【发布时间】:2015-10-27 09:35:13
【问题描述】:

我想在 R 中扫描多个文件中的字符串并知道哪些文件名具有该字符串。

有没有办法在函数中使用诸如 grep、cat、readLines 之类的东西?

如果我使用以下方式扫描文件:

fileNames <- Sys.glob("*.csv")

然后可能是这样的:

for (f in fileNames) {
    stuff <- read.csv(fileName, sep = ",")
    grep("string")

}

names(res) <- substr(filenames, 1, 30)

或者甚至更好,像这样的循环:

for( f in  filenames ){
   cat("string", file=f)
}

for( f in filenames) {
    cat(readLines(f), sep="\n")
}

这段代码不起作用,我只是想仔细考虑一下。我确定有更好的方法来做到这一点。听起来很简单,但我做错了。

我想扫描文件中的字符串,然后输出找到字符串的文件名。我还没有在 R 中找到这样做的示例。

建议?

【问题讨论】:

  • 你在运行什么平台?
  • 理查德,我在 Windows 上。在 OSX 和 Unix 中,我相信你可以使用命令来做到这一点。

标签: r string file csv


【解决方案1】:

请注意,在您的第一个代码示例中,您使用 f 作为循环变量,而在循环内您使用 fileName 代替(R 也区分大小写,因此 fileNamesfilenames 是不同的对象)。

如果您的搜索字符串不太可能包含 CSV 分隔符,您确实可以将readLines(..)grep(..) 一起使用。 grep(..) 然后返回字符串出现的行号列表。试试下面的代码:

fileNames <- Sys.glob("*.csv")

for (fileName in fileNames) {
   if (length(grep("string", readLines(fileName))) > 0) { print(fileName)}
}

【讨论】:

  • 这个答案出现在低质量审查队列中,大概是因为您没有解释代码。如果你确实解释了(在你的回答中),你更有可能获得更多的支持——提问者更有可能学到一些东西!
  • 感谢关于低质量队列的提示!我改进了“文本与代码的比率”和答案的总长度
  • 安德烈,这行得通。感谢您提供更多详细信息。函数中的“长度”有什么作用?
  • grep(..) 要么返回整数向量(对应于匹配的行),要么返回integer(0)。不使用length(..),只使用if (grep(...)) { ...} ,如果没有匹配,您将收到错误argument is of length zero,或者在匹配的情况下收到警告the condition has length &gt; 1 and only the first element will be usedlength(..) 本质上是返回匹配的行数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-26
相关资源
最近更新 更多