Groovy load.les fichiers csv

Comment lire et importer .fichier csv à groovy sur grails. J'ai .fichier csv avec des données et

besoin d'importer dans db en utilisant l'interface utilisateur .

28
demandé sur Haim Raman 2010-04-12 14:06:46

5 réponses

il y a comme toujours différentes possibilités de travailler avec des fichiers CSV dans Groovy.

comme Groovy est totalement interopérable avec Java, vous pouvez utiliser l'un des libaraires CSV existants, par exemple OpenCSV.

en fonction de la complexité du fichier CSV que vous utilisez, vous pouvez également utiliser les possibilités standard de gestion de fichier/chaîne de caractères de Groovy:

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 vient d'écrire un joli!--12-->blog à propos de la différentes possibilités qui sont disponibles pour travailler avec des fichiers CSV dans Groovy.

EDIT #2: Comme Leonard Axelsson!--18-->récemment publié la version 1.0 de sa bibliothèque GroovyCVS, j'ai pensé que je devrais certainement ajouter ceci à la liste des options.

46
répondu Christoph Metzendorf 2012-03-06 08:59:40

Utilisation de la xlson GroovyCSV:

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

les noms des champs sont tirés de l'en-tête du fichier CSV.

Si le fichier CSV n'a pas d'en-tête, vous pouvez spécifier les noms de champ de manière programmatique.

5
répondu Nicolas Raoul 2016-09-20 09:06:26

exemple utilisant opencsv

@Grab ('com.opencsv: opencsv: 4.0") import com.opencsv.CSVReader import com.opencsv.CSVWriter

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()
    }
}
1
répondu Haim Raman 2017-11-19 07:35:29

je préfère un léger ajustement sur la réponse acceptée: zip les colonnes et les valeurs ensemble, par opposition à l'indexation de chacun par le nombre. Le résultat est un code légèrement plus court.

def sql = Sql.newInstance("jdbc:mysql://localhost:3306/mydb", "user", "pswd", "com.mysql.jdbc.Driver")
def people = sql.dataSet("PERSON")
def columns = ['first_name', 'last_name', 'email']
new File("users.csv").splitEachLine(",") {values ->
    people.add([columns, values].transpose().collectEntries())
}
0
répondu jaco0646 2018-07-27 22:05:29

Apache Commons-CSV:

@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 a une bonne API et je le recommande.


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

(Prises à partir d'échantillons)


dernier recours: Expression régulière.

Voici comment j'ai analysé un fichier peut contenir une chaîne échappée citée dans sa quatrième colonne:

    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('\"','"');
0
répondu Ondra Žižka 2018-08-17 12:11:54