2015-11-11 4 views
3

J'utilise Groovy pour lire à partir d'un fichier CSV qui a les champs ci-dessous:Quelle est la façon la plus simple de modéliser ces données?

Code Name  Class 
    --- -----  ---- 
    1701 Enterprise Constitution  
    1864 Reliant  Miranda 

Quelle est la meilleure façon de représenter ces données dans Groovy?

Je pensais un HashMapcode est la clé et la valeur est un POGO avec deux champs (Nom et classe). Mais y a-t-il un moyen plus groovy?

Répondre

1

En utilisant un Map plain avec code comme une clé est assez bien. Cela dépend de ce que vous devez faire exactement. Si vous avez besoin de transformer ces données en Map c'est la voie à suivre.

Cependant, groovy est si élastique dans le traitement des données que vous pouvez également créer un POGO et transformer cette donnée CSV en une liste. Il peut être facilement regroupé par code ou tout ce dont vous avez besoin.

De plus, peut-être que créer un POGO n'est pas nécessaire? Dans ce cas, utilisez code une clé pour .. Map.

1

Avec un POGO et la transformation TupleConstructor AST, l'analyse syntaxique CSV dans une liste est généralement assez simple:

@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