如何从 groovy 中的 2 个 CSV 中获取特定值

How to get specific values from 2 CSV in groovy

请帮助将 groovy 中的 2 个文件的 CSV 解析为 JSON。 我有这样的第一个 CSV(每次行号可能不同):

testKey,status

Name001,PASS

Name002,PASS

Name003,FAIL

CSV2(所有测试密钥的列表,但密钥名称不同:

Kt,Pd 
PT-01,Name007

PT-02,Name001

PT-03,Name003

PT-05,Name002

PT-06,Name004

PT-07,Name006

我需要在结果中匹配与 testKey (testKey.CSV1=Kt=CSV2) 完全相同的值

像这样:

{
    "testExecutionKey": "DEMO-303",
    "info": {
        "user": "admin"
    },
    "tests": [
        {
            "testKey": "PT-02",
             "status": "PASS"
        },
        {
            "testKey": "PT-05",
             "status": "PASS"
        },
        {
            "testKey": "PT-03",
             "status": "FAIL"
        }
    ]
}

此代码仅解析相同的值但没有完全匹配 testKey:

File csv1 = new File( 'one.csv')
File csv2 = new File( 'two.csv')

def lines1 = csv1.readLines()
def lines2 = csv2.readLines()

assert lines1.size() <= lines2.size()
fieldSep = /,[ ]*/

def fieldNames1 = lines1[0].split( fieldSep )
def fieldNames2 = lines1[0].split( fieldSep )
def testList = []

lines1[1..-1].eachWithIndex { csv1Line, lineNo ->
  def mappedLine = [:]

  def fieldsCsv1 = csv1Line.split( fieldSep )
  fieldsCsv1[1..-1].eachWithIndex { value, fldNo -> 
    String name = fieldNames1[ fldNo + 1 ]
    mappedLine[ name ] = value
  }

  def fieldsCsv2 = lines2[lineNo + 1].split( fieldSep )
  fieldsCsv2[0..-2].eachWithIndex { value, fldNo -> 
    String name = fieldNames2[ fldNo ]
    mappedLine[ name ] = value
  }

  testList << mappedLine
}
def builder = new JsonBuilder()
def root = builder {
  testExecutionKey 'DEMO-303'
  info user: 'admin'
  tests testList
}

println builder.toPrettyString()

您需要将 CSV2 绑定到 Map,然后使用它来替换 CSV1 中的值,如下所示:

import groovy.json.*    

def csv1 = '''
testKey,status
Name001,PASS
Name002,PASS
Name003,FAIL
Name999,FAIL
'''.trim()

def csv2 = '''
Kt,Pd
PT-01,Name007
PT-02,Name001
PT-03,Name003
PT-05,Name002
PT-06,Name004
PT-07,Name006
'''.trim()

boolean skip1st = false

def testMap2 = [:]
//parse and bind 1st CSV to Map
csv2.splitEachLine( /\s*,\s*/ ){
  skip1st ? ( testMap2[ it[ 1 ] ] = it[ 0 ] ) : ( skip1st = true )
}

def keys
def testList = []
csv1.splitEachLine( /\s*,\s*/ ){ parts ->
  if( !keys )
    keys = parts*.trim()
  else{
    def test = [:]
    parts.eachWithIndex{ val, ix -> test[ keys[ ix ] ] = val }
    //check if testKey present in csv2
    if( testMap2[ test.testKey ] ){
      test.testKey = testMap2[ test.testKey ] // replace values from CSV2
      testList << test
    }
  }
}  

def builder = new JsonBuilder()
def root = builder {
    testExecutionKey 'DEMO-303'
    info user: 'admin'
    tests testList
 }

builder.toPrettyString()

给出:

{
    "testExecutionKey": "DEMO-303",
    "info": {
        "user": "admin"
    },
    "tests": [
        {
            "testKey": "PT-02",
            "status": "PASS"
        },
        {
            "testKey": "PT-05",
            "status": "PASS"
        },
        {
            "testKey": "PT-03",
            "status": "FAIL"
        }
    ]
}