2010-04-12 12 views

Odpowiedz

43

Zawsze są różne możliwości pracy z plikami CSV w Groovy.

Ponieważ Groovy jest w pełni zgodny z Javą, można użyć jednego z istniejących libararies CSV, np. OpenCSV.

W zależności od złożoności pliku CSV używasz, można także użyć standardowych możliwości obsługi plików/string 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 prostu napisał piękny blog post o różne możliwości pracy z plikami CSV w Groovy.

EDIT # 2: Jak Leonard Axelsson recently released version 1.0 swojej biblioteki GroovyCVS, myślałem, że to na pewno dodać do listy opcji.

+2

ja napisany groovified otacza OpenCSV, który nazywa się GroovyCSV i sprawia, że ​​praca z csv w Groovy jest dużo łatwiejsza i idiomatyczna. Jest dostępny pod adresem http: // xlson.com/groovycsv/ – xlson

0

z Apache Commons-CSV:

@Grab ('org.apache.commons: fotografia CSV: 1,2') importu org.apache.commons.csv.CSVParser importu statyczne org.apache.commons.csv. 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 ma przyjemne API i polecam.


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

(Taken from To próbek)


Last resort: Wyrażenie regularne.

Oto jak analizowany plik 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

Pierwsza metoda kończy się niepowodzeniem z 'groovy.lang.MissingMethodException: Brak sygnatury metody: sun.nio.fs.UnixPath.withReader() ma zastosowanie dla typów argumentów: (myscript $ _run_closure1) wartości: [myscript $ _run_closure1 @ 536f2a7e] ' –

3

Korzystanie xlson na 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" 
} 

Pole nazwy zostały zaczerpnięte z nagłówku pliku CSV.
Jeśli plik CSV nie ma nagłówka, można określić nazwy pól programowo.

0

Przykład wykorzystania 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() 
    } 
} 
Powiązane problemy