groovy - Groovy 匹配行和返回列
问题描述
首先,我是一个 Groovy 新手。我只对脚本做过小的调整。
我正在研究一个将用作 Jenkins 共享库的一部分的对象。这个想法是有一些通用的东西,可以根据传递给它的内容返回值。
@Grab('com.xlson.groovycsv:groovycsv:1.0')
import com.xlson.groovycsv.CsvParser
/**
* Given matchingValue in matchingColumn return the value in returnColumn
* Use verifyValue first to confirm the value is present
* @param matchingValue The value that is in matchingColumn
* @param matchingColumn The column to search
* @param returnColumn The column to return
* @return The value in returnColumn in the row of matchingValue
* @see #matchValue(String)
*/
Object matchValue(String matchingValue, String matchingColumn, String returnColumn) {
new File('test.csv').withReader { f ->
def data = new CsvParser().parse(f)
data.findAll{ (it.${matchingColumn} as String) == "${matchingValue}" }.each{return it.${returnColumn} }
}
}
def match = matchValue('apple','type','origin')
println "${match}"
test.csv 的内容:
type,color,origin
apple,red,tree
banana,yellow,ground
avacado,green,ground
lemon,yellow,tree
当我运行这个脚本时,我得到:
Caught: groovy.lang.MissingMethodException: No signature of method: com.xlson.groovycsv.PropertyMapper.$() is applicable for argument types: (csvmap$_matchValue_closure1$_closure2$_closure4) values: [csvmap$_matchValue_closure1$_closure2$_closure4@3f3c966c]
Possible solutions: is(java.lang.Object), any(), any(groovy.lang.Closure), use([Ljava.lang.Object;), tap(groovy.lang.Closure), wait()
groovy.lang.MissingMethodException: No signature of method: com.xlson.groovycsv.PropertyMapper.$() is applicable for argument types: (csvmap$_matchValue_closure1$_closure2$_closure4) values: [csvmap$_matchValue_closure1$_closure2$_closure4@3f3c966c]
Possible solutions: is(java.lang.Object), any(), any(groovy.lang.Closure), use([Ljava.lang.Object;), tap(groovy.lang.Closure), wait()
at csvmap$_matchValue_closure1$_closure2.doCall(csvmap.groovy:17)
at csvmap$_matchValue_closure1.doCall(csvmap.groovy:17)
at csvmap.matchValue(csvmap.groovy:15)
at csvmap.run(csvmap.groovy:21)
我假设这是因为动态列名,但我不知道如何处理。
解决方案
有两个主要问题:
- 按名称访问属性不是通过
it.${prop}
,而是通过it."${prop}"
-- 注意引号 each
用于副作用; 假设您只想返回第一个匹配项,则需要find
而不是findAll
+each
。
例如
@Grab('com.xlson.groovycsv:groovycsv:1.0')
import com.xlson.groovycsv.CsvParser
def matchValue(String matchingValue, String matchingColumn, String returnColumn) {
new File('test.csv').withReader { f ->
def data = new CsvParser().parse(f)
data.find{
(it."${matchingColumn}" as String) == "${matchingValue}"
}?."${returnColumn}"
}
}
def match = matchValue('apple','type','origin')
println match
// → tree
推荐阅读
- javascript - React Reach Router - 重新加载整个树
- c++ - 在另一个向量中插入一个向量而不使用前一个向量的开始和结束 (C++20)?
- javascript - React SSR:SyntaxError:导入图像时令牌无效或意外
- excel - Visual Basic 打开电子表格,然后保存它;有时文件被锁定
- django - 如何根据类别过滤帖子列表
- c++ - 错误:C++ 结构中的未知类型名称“V”
- android - Android 中 EditText 上的 KeyListener :
- azure - 未找到使用部署模板资源和接收资源组,但所有其他部署工作
- python - 我尝试使用功能 API 在 tensorflow 2.x 中创建模型,但出现 LSTM 层不兼容错误
- python - Heroku 在我的不和谐机器人中找不到 PyNaCl