我需要使用以下格式将csv文件转换为xml:
输入csv是
scott,male,26,doctor
ryan,male,20,student
laura,female,30,lawyer
生成的xml应为
<root>
<criteria name="scott" sex = "male" age = "26" profession = "doctor"/>
<criteria name="ryan" sex = "male" age = "20" profession = "student"/>
<criteria name="laura" sex = "female" age = "30" profession = "lawyer"/>
<root/>
并且在csv中如果缺少像职业那样的任何字段,
laura,female,30
生成的xml应为
<criteria name="laura" sex = "female" age = "30"/>
如果csv是:
laura,female,,lawyer
它产生
<criteria name="laura" sex = "female" age = "" profession = "lawyer"/>
我希望xml在哪里
<criteria name="laura" sex = "female" profession = "lawyer"/>
有人可以帮我解决在groovy中执行此操作的代码吗?
我正在使用的代码是
CommonsMultipartFile multiPartFile=fileList.first()
params.type = 'text/csv'
if(CSV_MIME_TYPE.contains(params.type)){
InputStream inputStream= multiPartFile.getInputStream()
def writer=new StringWriter()
def xmlBuilder= new MarkupBuilder(writer)
xmlBuilder.setDoubleQuotes(true)
xmlBuilder.root(){
inputStream.eachLine{ line->
def a,b,c,d,e,f,g
(a,b,c,d) = line.split(',',-1)
criteria(name:a,sex:b,age:c,profession:d)
}
答案 0 :(得分:2)
摆脱空字段的最简单方法是使用另一种映射方法。如果空值不在criteria()
调用的映射中,则不会生成任何内容。所以你可以像这样映射和过滤它们:
def line = 'laura,female,,lawyer'
def mapping = ['name', 'sex', 'age', 'profession']
// use criteria instead of println there
println([mapping,line.split(',',-1)*.trim()].transpose().findAll{it[1]}.collectEntries())
//=> [name:laura, sex:female, profession:lawyer]
transpose
将映射中的键与行中的值组合在一起(每个列表只需要相同的数量,因此行末的丢失数据没有问题);下一步过滤所有emtpy值,最后collectEntries
将这些值转换为地图
答案 1 :(得分:0)
您的代码按预期工作,但CSV代码段laura,female,,lawyer
中有一个额外的逗号,它会丢弃您的CSV'解析器'。
您的代码的缩写按预期工作,此处位于Groovy web console(单击“执行脚本”,然后打开“输出”选项卡 - 如果控制台加载为空,请尝试重新加载)。