【问题标题】:Read CSV file and put result in a map using Grails / Groovy使用 Grails / Groovy 读取 CSV 文件并将结果放入地图中
【发布时间】:2016-03-07 11:56:21
【问题描述】:

我正在使用下面的代码读取 csv 文件并希望将结果放入地图中

def fileName = 'C:/temp/exampleCSV.csv'
        def reader = new CSVReader(new FileReader(new File(fileName)))
        def header = reader.readNext()
        def rows = reader.readAll().collect { row ->
            (0..(row.size()-1)).collectEntries { [header[it], row[it]] }
        }

CSV:

name;cuInfo;service;startDate;appId
Apple;T12;3;14-02-16 10:00;G12351
Apple;T13;3;14-01-16 13:00;G12352
Google;T14;9;10-01-16 11:20;G12301
Microsoft;T15;10;26-02-16 10:20;G12999

但是上面的代码给了我输出:

  [
        [name;cuInfo;service;startDate;appId:Apple;T12;3;14-02-16 10:00;G12351], 
        [name;cuInfo;service;startDate;appId:Apple;T13;3;14-01-16 13:00;G12352], 
        [name;cuInfo;service;startDate;appId:Google;T14;9;10-01-16 11:20;G12301], 
        [name;cuInfo;service;startDate;appId:Microsoft;T15;10;26-02-16 10:20;G12999]
    ]

我想得到这个结构如下图?

[
        [name:"Apple", cuInfo:"T12",service:"3",startDate:"14-01-16 13:22",appId:"G12355"],
        [name:"Apple",cuInfo:"T13",service:"3",startDate:"12-02-16 13:00",appId:"G12356"],
        [name:"Google",cuInfo:"T14",service:"9",startDate:"10-01-16 11:20",appId:"G12300"], 
        [name:"Microsoft",cuInfo:"T15",service:"10",startDate:"26-02-16 10:20",appId:"G12999"]  
    ]

【问题讨论】:

  • 你有什么问题?
  • @droggo,我想找出来自 DB 和 csv 的数据之间的差异,并创建具有差异的新 csv
  • 所以比较它并打印到文件中。在这个问题中我没有看到任何需要解决的具体问题
  • @user3122166 显示您当前针对此问题的解决方案。
  • @MichalSzulc,当然我想过,我在上面编辑了我的代码,问题是如何从 csv 中获取与来自数据库的数据相同的结构

标签: java csv grails groovy


【解决方案1】:

要将 CSV 文件中的数据放入与查询输出相同的结构(地图列表)中,您可以这样做:

def reader = new CSVReader(new FileReader(new File(fileName)))
def output = reader.collect { it[0].split(';') }.with { rows ->
    def header = rows.head()
    def dataRows = rows.tail()

    dataRows.collect { row ->
        [header, row].transpose().collectEntries()
    }
}

CSV 行被拆分为列,标题和其余行被收集,然后进行转换。

transpose() 为每个数据行创建一个这样的结构:

[[name, Apple], [cuInfo, T12], [service, 3], [startDate, 14-02-16 10:00], [appId, G12351]]

collectEntries() 把它变成了Map

[name:Apple, cuInfo:T12, service:3, startDate:14-02-16 10:00, appId:G12351]

【讨论】:

  • @Rosa,伟大的作品!!!,谢谢,我的另一个问题是如何比较这张地图并找到 Grails 中的差异,请参阅上面的示例
  • 好问题!但是在 StackOverflow 上,您一次只能问一个问题。此外,这并不是一个真正的 Grails 问题。因此,请使用来自数据库和 CSV 文件的两个结构相同的示例 Maps 提出一个新的 Groovy 问题。
  • 你们在谈论哪个 groovy 版本?我还需要读取 csv 文件,但我的 groovy 版本 2.4.7 不提供 CSVReader
  • CSVReader 不是 Groovy 自带的,它来自第三方库。我相信它是 OpenCSV 的一部分:opencsv.sourceforge.net
  • 对于使用逗号分隔的 CSV 文件的任何人(我知道这很疯狂),请跳过 collect 步骤。然后第二行将读取def output = reader.with { rows ->
猜你喜欢
  • 1970-01-01
  • 2016-03-09
  • 2021-08-12
  • 2017-03-13
  • 2020-09-09
  • 1970-01-01
  • 2013-12-18
  • 1970-01-01
  • 2021-03-15
相关资源
最近更新 更多