为什么这个String→List→Map转换在Groovy中不起作用

时间:2016-10-20 14:59:47

标签: groovy data-conversion

我输入的数据类型为

abc    12d
uy     76d
ce     12a

线条由\n分隔,值由\t分隔。

数据来自shell命令:

brlist = 'mycommand'.execute().text

然后我想把它变成一张地图:

brmap = brlist.split("\n").collectEntries {
          tkns = it.tokenize("\t")
          [ (tkns[0]): tkns[1] ]
        }

我也试过

brmap = brlist.split("\n").collectEntries {
          it.tokenize("\t").with { [ (it[0]): it[1] ] }
        }

两种方式都给出了相同的结果,即带有单个条目的地图:

brmap.toString()
# prints "[abc:12d]"

为什么只有输入数据的第一行最终出现在地图中?

3 个答案:

答案 0 :(得分:1)

您的代码有效,这意味着输入字符串brlist不是您所说的......

你确定你拥有的是什么吗?尝试在brlist

内打印it,然后collectEntries

顺便说一句,这与你的代码完全相同:

brlist.split('\n')*.split('\t')*.toList().collectEntries()

或者你可以尝试(包括它的空格而不是制表符,这两者都是期望的)

brlist.split('\n')*.split(/\s+/)*.toList().collectEntries()

答案 1 :(得分:1)

此代码有效

// I use 4 spaces as tab.
def text = 'sh abc.sh'.execute().text.replaceAll(" " * 4, "\t")
brmap = text.split("\n").collectEntries {
    tkns = it.tokenize("\t")
    [(tkns[0]) : tkns[1]]
}
assert[abc:"12d", uy:"76d", ce:"12a"] == brmap

abc.sh

#!/bin/sh
echo "abc    12d"
echo "uy    76d"
echo "ce    12a

另外,我认为你的常规代码是正确的。也许你的mycommand有问题。

答案 2 :(得分:0)

好的,感谢提示,这是Jenkins的一个错误:https://issues.jenkins-ci.org/browse/JENKINS-26481

之前已经提到过:Groovy .each only iterates one time