脚本中的错误,用于计算出现次数

时间:2018-02-27 20:58:41

标签: groovy

我是Groovy脚本的新手,需要帮助。 我尝试使用以下脚本来计算具有特定文本的行数。

观察到错误:

groovy.lang.MissingMethodException: No signature of method: java.io.File.eachline() is applicable for argument types: (Hemanth_v1$_run_closure2) values: [Hemanth_v1$_run_closure2@10f39d0]
Possible solutions: eachLine(groovy.lang.Closure), eachLine(int, groovy.lang.Closure), eachLine(java.lang.String, groovy.lang.Closure), eachFile(groovy.lang.Closure), eachLine(java.lang.String, int, groovy.lang.Closure), eachFile(groovy.io.FileType, groovy.lang.Closure)

脚本:

def file = new File('C:\\NE\\header.txt');
count = 0
def data1= file.filterLine { line ->
    line.contains('smtpCus:');
}

//custom code by Hemanth
file.eachline { line, count ->
    if (line.contains('Received:')) {
        count++
    }
}

2 个答案:

答案 0 :(得分:1)

您向我们展示的脚本有两个问题:

  1. file.eachline中存在拼写错误 - 应为file.eachLine
  2. 传递给eachLine的闭包中的
  3. 你增加了一个局部变量count,所以外部count在执行后仍然是0
  4. 以下是您的脚本应该是什么样的:

    def file = new File('C:\\NE\\header.txt')
    count = 0
    def data1 = file.filterLine { line ->
        line.contains('smtpCus:')
    }
    
    //custom code by Hemanth
    file.eachLine { line ->
        if (line.contains('Received:')) {
            count++
        }
    }
    
    println count
    

    将文件读取为java.util.stream.Stream<T>

    如果要在Groovy(以及一般的Java)中读取文件,还有一件事值得一提。如果使用大文件,最好使用Java Stream API加载此文件 - Files.lines(path)

    import java.nio.file.Files
    import java.nio.file.Paths
    
    long counter = Files.lines(Paths.get('C:\\NE\\header.txt'))
            .filter { line -> line.contains('Received:') }
            .count()
    
    println counter
    

答案 1 :(得分:0)

Groovy方法使用驼峰案例。应该是eachLine()而不是eachline()。看看是否有帮助!