2017-10-02 3 views
1

Je suis actuellement nouveau et barboter avec groovy. J'ai fait une fonction simple appelée parseCsvFile. Cette fonction lit à partir d'un fichier CSV. Cependant, quand j'essaye de println je ne vois pas les valeurs mais à la place import au.com.bytecode.opencsv.CSVReader. Mon but ultime est de lire le fichier csv et de créer une paire de valeurs clés basée sur les données. Comment pourrais-je le mieux accomplir cela?Parsing fichier CSV et créer une paire valeur clé

Fonction pour l'analyse syntaxique:

import au.com.bytecode.opencsv.CSVReader 
import au.com.bytecode.opencsv.CSVParser 

def parseCsvFile(String csvFilePath){ 
    if (fileExists(csvFilePath)) { 
     new File(csvFilePath).withReader { reader -> 
      CSVReader csvReader = new CSVReader(reader) 
      csvReader.each { fields -> 
       println fields 
      } 
     } 
    } else { 
     throw error 
    }   

    //return a key value array 
} 

Exemple de csv:

GAME_ID,GAME_NAME,OLD_OWNER_NAME,NEW_OWNER_NAME,ORG_NAME 
20001,str.git,Gemini,Kitoshi,Blue-DiamondGames 
30001,str.git,Kashi,Sensu,FlyingMonkey 
+0

MaryCoding, s'il vous plaît vérifier la solution pour voir si cela est utile. – Rao

Répondre

1

Puisque vous utilisez groovy, vous pouvez simplement utiliser groovycsv et de réaliser la même chose avec si simple comme indiqué ci-dessous:

Exemple - csv as String

@Grab('com.xlson.groovycsv:groovycsv:1.1') 
import static com.xlson.groovycsv.CsvParser.parseCsv 

def csv = """GAME_ID,GAME_NAME,OLD_OWNER_NAME,NEW_OWNER_NAME,ORG_NAME 
20001,str.git,Gemini,Kitoshi,Blue-DiamondGames 
30001,str.git,Kashi,Sensu,FlyingMonkey""" 

def data = parseCsv(csv) 
for(line in data) { 
    println "$line.GAME_ID $line.GAME_NAME" 
} 

Vous pouvez également utiliser les données du fichier. Il suffit de mettre les données ci-dessus dans le fichier csv et contribuer à FileReader et le transmettre à parseCsv méthode comme indiqué ci-dessous:

Exemple - csv comme fichier

@Grab('com.xlson.groovycsv:groovycsv:1.1') 
import static com.xlson.groovycsv.CsvParser.parseCsv 
//Change the filepath as per your environment 
def data = parseCsv(new FileReader('/tmp/game.csv')) 
for(line in data) { 
    println "$line.GAME_ID $line.GAME_NAME" 
} 

Note: Vous devriez pouvoir utiliser la colonne nom pour faire référence les données si vous remarquez ci-dessus println déclaration

+0

Pourriez-vous le faire avec l'importation de 'au.com.bytecode.opencsv.'? Pour une raison quelconque, l'environnement dans lequel je suis ne résout pas 'com.xlson.groovycsv.' – MaryCoding

+0

Comment lancez-vous le script ci-dessus? Vous pouvez aller au lien fourni dans la réponse et télécharger la bibliothèque et les dépendances mentionnées. Puis ajoutez-les à classpath. Vous êtes bon à faire, je suppose. 'groovycsv' utilise' opencsv' uniquement dans les coulisses que vous essayez d'utiliser. – Rao

0

Eh bien, vous ne devriez probablement pas utiliser d'anciennes versions d'une bibliothèque. Dans la version que vous utilisez (< = 2,3), le CSVReader n'est pas une instance de Iterable, la méthode each appelé est celui de Object qui vient de itère sur l'objet lui-même. Si vous utilisez une version plus récente (> = 2.4) de la même bibliothèque (les noms et coordonnées des paquets ont été refactorisés) cela fonctionne comme un charme.

Voici un exemple:

@Grab('net.sf.opencsv:opencsv:2.3') 
import au.com.bytecode.opencsv.CSVReader as opencsv23 
@Grab('com.opencsv:opencsv:4.0') 
import com.opencsv.CSVReader as opencsv40 

new StringReader(
'''GAME_ID,GAME_NAME,OLD_OWNER_NAME,NEW_OWNER_NAME,ORG_NAME 
20001,str.git,Gemini,Kitoshi,Blue-DiamondGames 
30001,str.git,Kashi,Sensu,FlyingMonkey''' 
).withReader { reader -> 
    new opencsv23(reader).each { println it } 
    println '========================' 
    new opencsv40(reader).each { println it } 
} 

qui se traduit par

[email protected] 
======================== 
[GAME_ID, GAME_NAME, OLD_OWNER_NAME, NEW_OWNER_NAME, ORG_NAME] 
[20001, str.git, Gemini, Kitoshi, Blue-DiamondGames] 
[30001, str.git, Kashi, Sensu, FlyingMonkey]