如何枚举通道中的文件以使用`collectFile`

问题描述

我正在尝试在使用 collectFile 之前枚举频道中的文件重命名它们:

files.flatten().merge(Channel.fromList([1,2,3,4])).collectFile(storeDir: "$SCRATCH/intermediate") {
    item -> ["data${item[1]}.csv",item[0].text]
}

但是 latest 文档说通道的 merge 运算符已被弃用,但没有指出应该使用的任何替代方法。我可以用什么代替 merge

解决方法

migration notes 表示改用 join operator。如果您的输入是列表,您可以执行以下操作:

def indexedChannel( items ) {
    return Channel.from( items.withIndex() ).map { item,idx -> tuple( idx,item ) }
}

ch1 = indexedChannel( [ 15,20,21 ] )
ch2 = indexedChannel( [ 'a','b','c' ] )
ch3 = indexedChannel( [ 1,2,3 ] )

ch1
    .join( ch2 )
    .join( ch3 )
    .view()

结果:

[0,15,a,1]
[1,b,2]
[2,21,c,3]

但是,两个频道的合并/加入就没有必要一一列举了。只需使用 map operator:

def c = 1
Channel
    .fromPath( './data/*.txt' )
    .map { tuple( it,c++ ) }
    .collectFile(storeDir: "$SCRATCH/intermediate") { fn,count ->
        ["data${count}.csv",fn.text]
    }

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...