如何将冒号分隔的文本文件数据加载到Groovy Map中?
解决Groovy加载冒号分隔键值对到Map的问题
需求说明
将myfile.txt中冒号分隔的键值对数据加载到Groovy的Map中,通过拆分键值对并迭代填充实现目标。
myfile.txt内容
name:john name2:peter name3:albert
期望结果
[name: 'john', name2: 'peter', name3: 'albert']
原代码问题
原代码存在核心语法错误:给Map赋值时误用冒号:,正确赋值应使用等号=;同时未考虑值中可能包含冒号的情况,拆分逻辑不够严谨。
原代码:
def readFile = sh(returnStdout: true, script: "cat myfile.txt").trim() def map = [:] readFile.eachLine {line -> def(key,value) = line.split(':') map[key.trim()] : value.toString() } println map
修正后的代码
普通Groovy脚本场景
本地运行的Groovy脚本可直接读取文件:
def fileContent = new File('myfile.txt').text.trim() def map = [:] fileContent.eachLine { line -> // 限制拆分1次,避免值中含冒号时被错误拆分 def parts = line.split(':', 2) if (parts.size() == 2) { def key = parts[0].trim() def value = parts[1].trim() map[key] = value } } println map
Jenkins Pipeline场景
在Jenkins Pipeline中执行时,保留sh命令读取文件:
def readFile = sh(returnStdout: true, script: "cat myfile.txt").trim() def map = [:] readFile.eachLine { line -> def parts = line.split(':', 2) if (parts.size() == 2) { def key = parts[0].trim() def value = parts[1].trim() map[key] = value.toString() } } println map
修正要点
- 将Map赋值语句的
map[key.trim()] : value.toString()改为map[key] = value,修正语法错误 - 使用
split(':', 2)限制拆分次数,确保值中包含冒号时不会被拆分 - 增加
parts.size() == 2的判断,避免无效行导致数组越界 - 对键和值执行
trim(),去除可能存在的首尾空格
内容的提问来源于stack exchange,提问作者Slashlinux
相关产品推荐
相关产品推荐

