0

我有一本字典“数据”。我需要将一个键值对解析为一个进程。最终结果应如下所示:

carcode=somename
params={minimum=3000, ignore=60, maximum_A=2500, maximum_B=500}
carcode=somename2
params={minimum=5000, ignore=100, maximum_A=3500, maximum_B=22500}

我已经编写了这段代码,它使用硬编码值而不是变量“it”,我将在代码中指向它。

data = [
    "a" : "A",
    "b" : "B",
    "c" : [
        "somename":[
            "z" : "Z",
            "y" : "Y",
            "params" :[
                "minimum": "3000",
                "ignore": "60",
                "maximum_A": "2500",
                "maximum_B": "500"
            ]
        ],

        "somename2":[
            "z" : "Z",
            "y" : "Y",
            "params" :[
                "minimum": "5000",
                "ignore": "100",
                "maximum_A": "3500",
                "maximum_B": "22500"
            ]
        ]
    ]
]

carcodes = Channel.from(data.c.keySet())
transform_carcodes = carcodes.flatMap { it ->  [it] }
//HERE
results = transform_carcodes.flatMap { it ->  [barcode: it, params: data.c."somename".params] }
//HERE
results.subscribe onNext: { println it }

当前输出获取正确的键,但使用硬编码键的值:

carcode=somename
params={minimum=3000, ignore=60, maximum_A=2500, maximum_B=500}
carcode=somename2
params={minimum=3000, ignore=60, maximum_A=2500, maximum_B=500}

为什么我这样做时它不起作用params: data.c.it.params

我得到输出:Cannot get property 'params' on null object

我试过了toString(it)

此外,一旦我得到输出,如何将这个 k/v 对传递给一个进程,并为每个 k/v 对生成一个新进程?

process{
    container "python:3"

    script:
    """
    python3 some_file.py <key> <value>
    """
}

当运行这个过程应该产生:

python3 some_file.py somename {minimum=3000, ignore=60, maximum_A=2500, maximum_B=500}
python3 some_file.py somename2 {minimum=3000, ignore=60, maximum_A=2500, maximum_B=500}
4

2 回答 2

1

如果您这样做data.c.it.params,则将it其视为嵌套映射中的另一个键。只要不存在这样的密钥,您就会得到该params密钥的空值。

构建所需结果的代码可能如下所示

def data = [....]

data.c.each{ k, v -> 
  "python3 some_file.py $k {${v.params.collect{ "$it.key=$it.value" }join(', ')}}".execute().text
}

每个字符串都呈现为

python3 some_file.py somename {minimum=3000, ignore=60, maximum_A=2500, maximum_B=500}
python3 some_file.py somename2 {minimum=5000, ignore=100, maximum_A=3500, maximum_B=22500}
于 2019-10-17T09:21:36.287 回答
0

在 Nextflow 中,这就是我设法处理此问题的方式:

诀窍是使用c[it]而不是c.it

carcodes = Channel.from(data.c.keySet())
transform_carcodes = carcodes.flatMap { it ->  [it] }
results = transform_carcodes.flatMap { it ->  [ [it, data.c[it].params] ] }

process A{
    echo true

    input:
    set x,y from results

    script:
    """
    python3.7 run_me.py ${x} \'${y}\'
    """

}

run_me.py

import sys

print("First:")
print(sys.argv[1])
print("Second:")
print(sys.argv[2])

和输出:

[15/aec54c] process > A (1) [100%] 2 of 2 ✔
First:
somename
Second:
[minimum=3000, ignore=60, maximum_A=2500, maximum_B=500]

First:
somename2
Second:
[minimum=5000, ignore=100, maximum_A=3500, maximum_B=22500]
于 2019-10-17T11:13:36.487 回答