【问题标题】:Using grep, grepl and regexpr within loops in R在 R 的循环中使用 grep、grepl 和 regexpr
【发布时间】:2015-03-17 16:14:53
【问题描述】:

我想使用 grep、grepl 和 regexpr 自动从文本文件中提取某些信息。当我为每个单独的文件执行此操作时,我有一个可以工作的代码,但是我无法让循​​环工作,以自动化我工作目录中所有文件的过程。

由于数据的结构,我将 txt 文件作为字符串读取。该循环似乎会根据目录中的文件数多次迭代第一个文件,这显然是因为for 语句中的length(txtfiles)command。

txtfiles = list.files(pattern="*.txt")

for (i in 1:length(txtfiles)){
all_data <- readLines(txtfiles[i])

#select hours of operation 
hours_op[i] <- all_data[hours_of_operation <- grep("Annual Hours of Operation:",all_data)]
hours_op[i] <-regmatches(hours_op, regexpr("[0-9]{1,9}.[0-9]{1,9}",hours_op))

}

如果有人能指出正确的方向来为每个文件重复此例程,而不是多次重复同一个文件,我将不胜感激。我想得到一个文件名列表和相应的hours_op

【问题讨论】:

  • 您是否检查了变量txtfiles 以确保您没有捕获文本文件的备份副本?您可以使您的模式更具体(例如"\\.txt$"),因为模式参数被解释为正则表达式。 ($ 字符强制使用文件名的结尾,因此您不会获得带有.txt~ 之类的扩展名的备份副本)。您还可以排除任何以点开头的隐藏文件,如下所示:pattern='^[^.].*\\.txt$'
  • @Jthorpe 是的,我尝试了这个但没有运气,同样的事情。另外我有多个警告:要替换的项目数不是替换长度的倍数。

标签: r regex loops


【解决方案1】:

您需要为您对hours_op[i] 的每一个引用添加一个索引 ([i]),如下所示:

for (i in 1:length(txtfiles)){
    all_data <- readLines(txtfiles[i])
    hours_op[i] <- all_data[hours_of_operation <- grep("Annual Hours of Operation:",all_data)]
    hours_op[i] <-regmatches(hours_op[i], regexpr("[0-9]{1,9}.[0-9]{1,9}",hours_op[i]))
}

或者更好的是,使用临时变量:

for (i in 1:length(txtfiles)){
    all_data <- readLines(txtfiles[i])
    temp <- all_data[hours_of_operation <- grep("Annual Hours of Operation:",all_data)]
    hours_op[i] <-regmatches(temp, regexpr("[0-9]{1,9}.[0-9]{1,9}",temp))
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 2016-02-15
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-25
    相关资源
    最近更新 更多