2010-04-12 21 views
26

Cómo leer e importar archivos .csv en groovy en grial. Tengo un archivo .csv con datos y
necesario para importar en db usando la interfaz de usuario.Groovy load .csv files

Respuesta

43

Siempre hay diferentes posibilidades de trabajar con archivos CSV en Groovy.

Como Groovy es totalmente interoperable con Java, puede utilizar una de las bibliotecas de CSV existentes, p. OpenCSV.

Dependiendo de la complejidad del archivo CSV que está utilizando, también se pueden utilizar las posibilidades de manejo de archivos/secuencia estándar de maravilloso:

def sql = Sql.newInstance("jdbc:mysql://localhost:3306/mydb", 
    "user", "pswd", "com.mysql.jdbc.Driver") 
def people = sql.dataSet("PERSON") 
new File("users.csv").splitEachLine(",") {fields -> 
    people.add(
    first_name: fields[0], 
    last_name: fields[1], 
    email: fields[2] 
) 
} 

EDIT: Kelly Robinson acaba de escribir un buen blog post acerca las diferentes posibilidades que están disponibles para trabajar con archivos CSV en Groovy.

editar # 2: Como Leonard Axelsson recently released version 1.0 de su biblioteca GroovyCVS, pensé que definitivamente debo añadir esto a la lista de opciones.

+2

He escrito un groovified envoltura alrededor de OpenCSV que se llama GroovyCSV y hace que trabajar con csv en Groovy sea mucho más fácil e idiomático. Está disponible en http: // xlson.com/groovycsv/ – xlson

0

Con Apache Commons-CSV:

@Grab ('org.apache.commons: Commons-CSV: 1.2') importación org.apache.commons.csv.CSVParser importación org.apache.commons.csv estática. CSVFormat. *

@Grab('org.apache.commons:commons-csv:1.2') 
import org.apache.commons.csv.CSVParser 
import static org.apache.commons.csv.CSVFormat.* 

import java.nio.file.Paths 

Paths.get('countryInfo.txt').withReader { reader -> 
    CSVParser csv = new CSVParser(reader, DEFAULT.withHeader()) 

    for (record in csv.iterator()) { 
     println record.dump() 
    } 
} 

Commons-CSV tiene buena API y la recomiendo.


Con GroovyCSV:

@Grab('com.xlson.groovycsv:groovycsv:0.2') 
import com.xlson.groovycsv.CsvParser 

def csv = '''Name,Lastname 
Mark,Andersson 
Pete,Hansen''' 

def data = new CsvParser().parse(csv) 
for(line in data) { 
    println "$line.Name $line.Lastname" 
} 

(de ello se disminuirá de muestras)


Último recurso: Expresión regular.

Así es como he analizado sintácticamente un archivo que might contain a quoted escaped string in it's fourth column:

File detailedStatsFile = new File("stats.csv"); 
    detailedStatsFile.eachLine { line, number -> 
     // Number Of Executions, Total Milliseconds, Milliseconds per execution, "Type" 
     def match = line =~ /([^,]*?),\s*([^,]*?),\s*([^,]*?),\s*(?:([^",]+)|(?:"((?:[^\\"]++(?:\\")?)++)"))$/; //" 

     if (!match.matches()) 
      continue; 

     def numberOfExecs = Integer.valueOf(match.group(1)); 
     def totalMillis = Integer.valueOf(match.group(2)); 
     def detailedStatName = match.group(4); 
     if (detailedStatName == null) 
      detailedStatName = match.group(5).replaceAll('\\"','"'); 
+1

Primer método falla con 'groovy.lang.MissingMethodException: ninguna firma de método: sun.nio.fs.UnixPath.withReader() es aplicable para los tipos de argumento: (myscript $ _run_closure1) values: [myscript $ _run_closure1 @ 536f2a7e] ' –

3

El uso de GroovyCSV xlson:

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

for(line in parseCsv(new FileReader('countries.csv'), separator: ';')) { 
    println "Country=$line.COUNTRY, Capital=$line.CAPITAL" 
} 

El campo de nombres se toman de la cabecera del archivo CSV.
Si el archivo CSV no tiene encabezado, puede especificar los nombres de campo mediante programación.

0

Ejemplo utilizando opencsv

@Grab ('com.opencsv: opencsv: 4,0') importación com.opencsv.CSVReader com.opencsv.CSVWriter importación

class TestCsvReader { 


    static main(args) { 
     def csv = '''"a","b","c" 
"d","e","f" 
''' 
     def Reader csvFileReader = new StringReader(csv) 
     def Writer csvFileWriter = new PrintWriter(System.out) 
     def CSVReader reader = new CSVReader(csvFileReader) 
     def CSVWriter writer = new CSVWriter(csvFileWriter) 

     reader.iterator().each { fields -> 
      writer.writeNext(fields) 
     } 
     reader.close() 
     writer.close() 
    } 
}