解析CSV文件并创建键值对

时间:2017-10-02 22:15:36

标签: csv groovy

我现在是新人,涉及groovy。我做了一个名为parseCsvFile的简单函数。此功能从CSV文件中读取。但是,当我尝试println时,我看不到值,而是import au.com.bytecode.opencsv.CSVReader。我的最终目标是读取csv文件并根据数据创建键值对。我怎么能最好地完成那个?

解析功能:

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
}

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

2 个答案:

答案 0 :(得分:1)

由于你使用的是groovy,你可以简单地使用groovycsv并实现同样的目的,如下所示:

示例 - 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"
}

您还可以使用文件中的数据。只需将上述数据放入csv文件并向FileReader提供输入,并将其传递给parseCsv方法,如下所示:

示例 - csv as File

@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"
}

注意:如果您注意到上述println声明

,您应该可以使用列名来引用数据

答案 1 :(得分:0)

好吧,你可能不应该使用古代版本的库。在您使用的版本(< = 2.3)中,CSVReader不是Iterable的实例,因此调用的each方法是来自Object的方法迭代对象本身。如果您使用相同库的更新版本(> = 2.4)(包名称和坐标被重构),它就像魅力一样。

这是一个例子:

@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 }
}

结果是

au.com.bytecode.opencsv.CSVReader@31e9a763
========================
[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]