groovy конвертировать из csv в json

Как я могу преобразовать CSV в JSON и получить доступ к объектам по отдельности для создания пользовательской строки? Почему в следующем коде я не могу просмотреть вывод log.info(rows.Id[0]) ?????? Когда я печатаю, в консоли отображается ноль.

data.csv имеет два столбца (идентификатор, значение) со 100 строками.

import groovy.json.JsonOutput
import groovy.json.JsonSlurper
def lines = new File('data.csv').readLines()

def keys = lines[0].split(',')
def rows = lines[1..-1].collect { line ->
def i = 0, vals = line.split(',')
        keys.inject([:]) { map, key -> map << ["$key": vals[i++]] }
    }

def jsonSlurper = new JsonSlurper()
jsonSlurper = jsonSlurper.parse(JsonOutput.toJson(rows))
log.info(JsonOutput.prettyPrint(JsonOutput.toJson(rows)))
log.info(rows.Id[0])

person George    schedule 23.10.2020    source источник


Ответы (1)


Ваша проблема здесь заключается в использовании GString в качестве ключа на карте. Это выглядит/печатается как строковый ключ, но с точки зрения идентичности (как карта выглядит) это не так.

groovy:000> key = "a"
===> a
groovy:000> ["$key": 1].containsKey(key)
===> false
groovy:000> [(key): 1].containsKey(key)
===> true

Поэтому используйте: [(key): vals[i++]] вместо этого.

Или, если вы хотите продолжить гольф:

[keys, line.split(',')].transpose().collectEntries()
person cfrick    schedule 23.10.2020
comment
javax.script.ScriptException: javax.script.ScriptException: groovy.lang.MissingMethodException: Нет подписи метода: groovy.json.JsonSlurper.parse() применимо для типов аргументов: (String) значения: - person George; 23.10.2020
comment
Я вижу это исключение, когда я перешел на [(key): vals[i++]] . Моя цель - прочитать csv и преобразовать в json, чтобы я мог манипулировать несколькими вещами (создавать новую строку из значений, которые я фиксирую) в соответствии с моим требованием. - person George; 23.10.2020
comment
Это parseText, а не parse. Сообщение об ошибке, скорее всего, говорит вам об этом. - person cfrick; 23.10.2020
comment
Хорошо, можете ли вы сказать мне, почему этот код ничего не возвращает? Это расширение для приведенного выше one.def foo= (int)Math.floor(rows.Id.size()/1000) def subList=rows.Id.subList(0, 1000) String str = subList.toString(). join('-') println(str) def names_str = jsonSlurper.Id.getClass() - person George; 23.10.2020
comment
если у вас есть другие вопросы, пожалуйста, создайте новый вопрос - person cfrick; 23.10.2020