groovy读取文件获取某些行,然后将每个检索到的行拆分为多个部分

时间:2011-11-15 19:24:58

标签: groovy

我认为在Groovy中必须有一种优雅的方式来执行此操作(即常见任务)。有人可以给一个代码片段吗?此问题与此条目有关:groovy what's wrong with this basic closure?

...看起来像使用闭包的File.filterLine()方法是一个好的开始,但是一旦你有这些线,分开它们的优雅方法是什么?例如。假设有人试图在逗号分隔文件(CSV)中挑选出某些行,然后将这些行分开。

2 个答案:

答案 0 :(得分:5)

如果您不关心效率或将整个文件加载到内存中,这将有效:

new File("myFile.csv").readLines().findAll { it =~ ~/regexp/ }*.tokenize(",")

Groovy似乎没有一种非常好的方法来过滤流中的行而不将文件加载到内存中。这是使用小型支持类进行此操作的一种方法:

new LineFilter(new File("myFile.csv").newReader(), ~/regexp/)*.tokenize(",")

@groovy.transform.Canonical
class LineFilter implements Iterator {
    def source
    def filter
    def peek = []

    String next() {
        while (true) {
            if (peek) {
                return peek.pop()
            }
            def nextLine = source.readLine()
            if (nextLine == null) {
                throw new NoSuchElementException()
            } else if (nextLine =~ filter) {
                return nextLine
            }
        }
    }

    boolean hasNext() {
        try {
            if (!peek) {
                peek.push(next())
            }
        } catch (NoSuchElementException e) {
            return false
        }
        true
    }

    void remove() { throw new UnsupportedOperationException() }
}

答案 1 :(得分:4)

您可以像这样使用splitEachLine

new File( 'file.csv' ).splitEachLine( /,/ ) { it ->
  println it
}

但是没有任何形式的例子,很难看出你想要实现的目标......

其他问题的方式有什么问题?

还有什么比这更好的?

严重的是,如果您正在尝试阅读CSV,请使用CSV解析库,例如GroovyCSV