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 .
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.
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.
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()
}
}
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())
}
@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.
@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('\"','"');