Groovy code to convert json to CSV file
groovy
Solution
Ok, how's this:
import groovy.json.*
// Added extra fields and types for testing
def js = '''{"infile": [{"field1": 11,"field2": 12, "field3": 13},
{"field1": 21, "field4": "dave","field3": 23},
{"field1": 31,"field2": 32, "field3": 33}]}'''
def data = new JsonSlurper().parseText( js )
def columns = data.infile*.keySet().flatten().unique()
// Wrap strings in double quotes, and remove nulls
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' )
That prints:
"field3","field2","field1","field4"
13,12,11,
23,,21,"dave"
33,32,31,
Which looks correct to me
Problem
Does anyone have any sample Groovy code to convert a JSON document to CSV file? I have tried to search on Google but to no avail. Example input (from comment): ``` [ company_id: '1', web_address: 'vodafone.com/', phone: '+44 11111', fax: '', email: '', addresses: [ [ type: "office", street_address: "Vodafone House, The Connection", zip_code: "RG14 2FN", geo: [ lat: 51.4145, lng: 1.318385 ] ] ], number_of_employees: 91272, naics: [ primary: [ "517210": "Wireless Telecommunications Carriers (except Satellite)" ], secondary: [ "517110": "Wired Telecommunications Carriers", "517919": "Internet Service Providers", "518210": "Web Hosting" ] ] ``` More info from an edit: ``` def export(){ def exportCsv = [ [ id:'1', color:'red', planet:'mars', description:'Mars, the "red" planet'], [ id:'2', color:'green', planet:'neptune', description:'Neptune, the "green" planet'], [ id:'3', color:'blue', planet:'earth', description:'Earth, the "blue" planet'], ] def out = new File('/home/mandeep/groovy/workspace/FirstGroovyProject/src/test.csv') exportCsv.each { def row = [it.id, it.color, it.planet,it.description] out.append row.join(',') out.append '\n' } return out } ```