Groovy字符串到CSV

Groovy字符串到CSV,groovy,Groovy,我有一个如下结构的字符串输入: [{name=John, dob=1970-07-27 00:00:00.0, score=81}, {name=Jane, dob=1970-07-28 00:00:00.0, score=77}] 我正在尝试将其转换为CSV输出。因此,预期产出: "name", "dob", "score" "John", "1970-07-27 00:00:00.0", 81 "Jane", "1970-07-28 00:00:00.0", 77 到目前为止,我已经尝

我有一个如下结构的字符串输入:

[{name=John, dob=1970-07-27 00:00:00.0, score=81}, 
{name=Jane, dob=1970-07-28 00:00:00.0, score=77}]
我正在尝试将其转换为CSV输出。因此,预期产出:

"name", "dob", "score"
"John", "1970-07-27 00:00:00.0", 81
"Jane", "1970-07-28 00:00:00.0", 77
到目前为止,我已经尝试过类似的方法

def js = "[{name=John, dob=1970-07-27 00:00:00.0, score=81}, {name=Jane, dob=1970-07-28 00:00:00.0, score=77}]"

def js = new JsonSlurper().parseText(s)

def columns = js*.keySet().flatten().unique()

def encode = { e -> e == null ? '' : e instanceof String ? /"$e"/ : "$e" }

// Print all the column names
println columns.collect { c -> encode( c ) }.join( ',' )

// Then create all the rows
println data.infile.collect { row ->
    // A row at a time
    columns.collect { colName -> encode( row[ colName ] ) }.join( ',' )
}.join( '\n' )
此操作失败,原因是
groovy.json.JsonException:应为“}”或“,”但得到了当前字符“n”
定义不带引号的var js失败,原因是
需要“}”、找到“、”


提前感谢

您可以尝试此代码片段

    import groovy.json.JsonSlurper

    def s = '[{"name":"John", "dob":"1970-07-27 00:00:00.0", "score":81},{"name":"Jane", "dob":"1970-07-28 00:00:00.0", "score":77}]'
    def js = new JsonSlurper().parseText(s)
    def columns = js*.keySet().flatten().unique()
    def encode = { e -> e == null ? '' : e instanceof String ? /"$e"/ : "$e" }
    println columns.collect { c -> encode(c) }.join(',')

    js.each {
        println it.values().join(",")
    } ​

我使用Groovy JsonSlurper将字符串转换为映射,为此,您需要给出正确的json字符串

我编写了一个简单的解析器,它将拆分行。如果您的输入发生更改(即,逗号或
=
用于任何其他位置),您将需要一个更复杂的解析器:

input = '''[{name=John, dob=1970-07-27 00:00:00.0, score=81}, 
{name=Jane, dob=1970-07-28 00:00:00.0, score=77}, 
{name=Test, dob=1980-01-01 00:00:00.0, score=90}]'''


maps = (input =~ /\{(.*)\}/)
    .collect { 
        it[1]
            .split(', ')
            .collectEntries { entry ->
                entry.split '=' with {
                    [it.first(), it.last()]
                }
            }
    }


assert maps == [
    [name:'John', dob:'1970-07-27 00:00:00.0', score:'81'],
    [name:'Jane', dob:'1970-07-28 00:00:00.0', score:'77'], 
    [name:'Test', dob:'1980-01-01 00:00:00.0', score:'90']
]

js
不是合法的字符串文字,或者是合法的列表或映射文字。你是对的。如果这是一份合法的名单,那么解决问题就很简单了。不幸的是,这就是我所拥有的。尝试用双引号将其字符串化也无济于事,您不能在groovy源文件中键入JSON并期望它能被很好地解析。或者将其作为字符串使用(如果这是您所拥有的),然后使用JsonSlurper对其进行解析,或者使用groovy list/map文本编写它。如何以及从何处获取此数据<代码>[{name=John,dob=1970-07-27 00:00:00.0,score=81}我创建了一个简化版本的真实数据。实际数据有131个字段,是一个从政府机构接收的转储。没有选择返回并得到一个格式良好的JSON或合法的List.String不是一个格式良好的JSONN,您必须将原始字符串格式化为适当的JSON字符串。谢谢你。