对这些数据建模的 Grooviest 方法是什么?
What is the Grooviest way to model this data?
我正在使用 Groovy 从具有以下字段的 CSV 文件中读取:
Code Name Class
--- ----- ----
1701 Enterprise Constitution
1864 Reliant Miranda
在 Groovy 中表示此数据的最佳方式是什么?
我在想 HashMap
,其中 Code 是键,值是具有两个字段的 POGO(Name和 Class)。但是有更好的方法吗?
使用普通的 Map
和 code
作为键就足够了。这取决于你需要做什么。如果您需要将此数据转换为 Map
,那就是要走的路。
然而groovy在数据处理方面非常灵活,您还可以创建一个 POGO 并将此 CSV 数据转换为列表。它可以很容易地按 code
或任何你需要的分组。
此外,也许没有必要创建 POGO?在这种情况下使用 code
a a key to.. Map
.
使用 POGO 和 TupleConstructor
AST 转换,将 CSV 解析为列表通常非常简单:
@Grapes(
@Grab(group='org.apache.commons', module='commons-csv', version='1.2')
)
import groovy.transform.*
import org.apache.commons.csv.*
@ToString
@TupleConstructor
class Test {
int code
String name
String type
}
def text = ''' Code,Name,Class
1701,Enterprise,Constitution
1864,Reliant,Miranda'''
def parsed = CSVParser.parse(text, CSVFormat.EXCEL.withHeader().withIgnoreSurroundingSpaces().withQuote(null))
def result = parsed.getRecords().collect { new Test(it.Code as int, it.Name, it['Class']) }
assert '[Test(1701, Enterprise, Constitution), Test(1864, Reliant, Miranda)]' == result.toString()
assert 'Enterprise' == result.find({ it.code == 1701 }).name
我正在使用 Groovy 从具有以下字段的 CSV 文件中读取:
Code Name Class
--- ----- ----
1701 Enterprise Constitution
1864 Reliant Miranda
在 Groovy 中表示此数据的最佳方式是什么?
我在想 HashMap
,其中 Code 是键,值是具有两个字段的 POGO(Name和 Class)。但是有更好的方法吗?
使用普通的 Map
和 code
作为键就足够了。这取决于你需要做什么。如果您需要将此数据转换为 Map
,那就是要走的路。
然而groovy在数据处理方面非常灵活,您还可以创建一个 POGO 并将此 CSV 数据转换为列表。它可以很容易地按 code
或任何你需要的分组。
此外,也许没有必要创建 POGO?在这种情况下使用 code
a a key to.. Map
.
使用 POGO 和 TupleConstructor
AST 转换,将 CSV 解析为列表通常非常简单:
@Grapes(
@Grab(group='org.apache.commons', module='commons-csv', version='1.2')
)
import groovy.transform.*
import org.apache.commons.csv.*
@ToString
@TupleConstructor
class Test {
int code
String name
String type
}
def text = ''' Code,Name,Class
1701,Enterprise,Constitution
1864,Reliant,Miranda'''
def parsed = CSVParser.parse(text, CSVFormat.EXCEL.withHeader().withIgnoreSurroundingSpaces().withQuote(null))
def result = parsed.getRecords().collect { new Test(it.Code as int, it.Name, it['Class']) }
assert '[Test(1701, Enterprise, Constitution), Test(1864, Reliant, Miranda)]' == result.toString()
assert 'Enterprise' == result.find({ it.code == 1701 }).name