请参阅列标题 csv Groovy

Refer to column headings csv Groovy

我想知道在 groovy 中是否可以使用 OpenCSV 访问 CSV 中的列标题?这是我的:

@GrabConfig( systemClassLoader=true )
@Grab( 'mysql:mysql-connector-java:5.1.27' )
@Grab(group = 'net.sf.opencsv', module = 'opencsv', version = '2.3')
import groovy.sql.Sql
import au.com.bytecode.opencsv.CSVReader
import au.com.bytecode.opencsv.CSVParser
def sql = Sql.newInstance("jdbc:mysql://localhost:3306/nid", "developer","whatever", "com.mysql.jdbc.Driver")
def notes = sql.dataSet("vdc_notifications")
def TEST_FILE_NAME = 'C:\Users\me\Desktop\test.csv'

List<String[]> rows = new CSVReader(new FileReader(new File(TEST_FILE_NAME)), CSVParser.DEFAULT_SEPARATOR, CSVParser.DEFAULT_ESCAPE_CHARACTER, CSVParser.DEFAULT_QUOTE_CHARACTER).readAll()

我想做的是能够做到:

rows.each() { row -> println row.some_column_name }

通常 CSV 文件的第一行包含列的名称。所以你可以使用简单的解析方法并为 header:

取第一行
@Grab('net.sf.opencsv:opencsv:2.3')
import au.com.bytecode.opencsv.CSVReader
import au.com.bytecode.opencsv.bean.CsvToBean;
import au.com.bytecode.opencsv.bean.HeaderColumnNameMappingStrategy;

def csv = """\
name,age
Charlie,23
Billy,64"""

// read the files and keep the first one as the header
def csvr = new CSVReader(new StringReader(csv))
def header
while ((line=csvr.readNext())) {
    if (!header) {
        header = line
    } else {
        // create a map from the header and the line
        println([header,line].transpose().collectEntries())
    }
}

或者您可以使用 CsvToBeanHeaderColumnNameMappingStrategy 来创建 beans:

class Person {
    String name
    Integer age
}

// use the mapper
def ctb = new CsvToBean<Person>()
def hcnms = new HeaderColumnNameMappingStrategy<Person>()
hcnms.type = Person
println ctb.parse(hcnms, new StringReader(csv))