【问题标题】:R: a grep alternative for a file without using readLines?R:不使用 readLines 的文件的 grep 替代方案?
【发布时间】:2016-01-17 19:32:07
【问题描述】:

任何包中是否有任何函数可以使用正则表达式读取文本文件并返回找到的匹配项的字符串数。就像 gsubfn read.pattern 可以找到并提取模式但不能返回行号和 grep 不能直接读取文件。示例:

文件:

  .122448110000D+06  .400000000000D+01                                      
 3 15  3 23 10  0  0.0  .267305411398D-03  .161435309564D-10  .000000000000D+01
  .510000000000D+02  .625000000000D-01  .440982654411D-08  .306376855997D+00
 5 15  3 23 11 59 44.0 -.263226218521D-03  .488853402202D-11  .000000000000D+01

模式:reg="^ *\\d+ +(?:[0-9]+ +){5}[.0-9]+.*$" 用于第 2 行和第 4 行匹配。所以我一般想要的是:

>file.grep(file,reg)
[1] 2 4

有什么东西吗?在处理此类事情时,我的一般理念是readLines,然后使用grep 发挥创意,当文件不是那么大时这很好。但是我在这里读到很多人对大型而不是表结构的数据集有问题,这些问题可以用这种工具(或readLines支持正则表达式skip参数)解决,我想知道是否有人做过类似的事情。

【问题讨论】:

    标签: regex r


    【解决方案1】:

    已编辑1

    我刚刚找到了另一篇与此问题相关的帖子,并提供了另一种解决方案: grep while reading file

    原帖

    这是你要找的吗?

    library(gsubfn)
    
    cat(" .122448110000D+06  .400000000000D+01
     3 15  3 23 10  0  0.0  .267305411398D-03  .161435309564D-10  .000000000000D+01
     .510000000000D+02  .625000000000D-01  .440982654411D-08  .306376855997D+00
     5 15  3 23 11 59 44.0 -.263226218521D-03  .488853402202D-11  .000000000000D+01", file = "test.txt")
    read.pattern(text = readLines("test.txt"), pattern = "^ *\\d+ +(?:[0-9]+ +){5}[.0-9]+.*$")
    

    【讨论】:

    • 确实是一个非常巧妙的技巧,但不幸的是,没有。问题是,我需要字符串数字来提取它们之间的东西而不是行。我想在两条明确的匹配线之间留出一个块(例如,低于第 2 条直到第 4 条)。如果 read.pattern 一次不读取一行,这将起作用,那么我可以使用正则表达式并在匹配之间提取数据,但它会这样做,因此我不能。
    • 其他问题也不起作用 - 匹配字符串在它们之间有一些关于块的额外数据,我不能只是将所有块混合在一起 - 它们可能有不同数量的行 - 在中指定匹配字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 2015-01-02
    • 2013-08-03
    • 1970-01-01
    • 2021-09-29
    • 2021-12-29
    • 1970-01-01
    相关资源
    最近更新 更多