2010-04-12 150 views
26

如何在groovy上讀取和導入.csv文件在grails上。我有.csv文件與數據和
需要導入到數據庫使用用戶界面。Groovy加載.csv文件

回答

43

在Groovy中使用CSV文件一直有不同的可能性。由於Groovy與Java完全可互操作,因此您可以使用現有的CSV庫中的一種,例如, OpenCSV

根據該CSV的複雜性文件,您正在使用,你也可以使用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] 
) 
} 

編輯: 凱利·羅賓遜只寫了一個不錯的blog post約在Groovy中可用於處理CSV文件的不同可能性。

編輯#2: 作爲倫納德Axelsson他GroovyCVS庫recently released version 1.0,我想我一定要這個增加的選項列表。

+2

我寫了一個groovified封裝OpenCSV,它被稱爲GroovyCSV,並且使Groovy中的csv更容易和習慣。它可在http:// xlson上找到。com/groovycsv/ – xlson 2011-09-29 12:25:17

0

隨着Apache Commons-CSV

@Grab( 'org.apache.commons:公地CSV:1.2') 進口org.apache.commons.csv.CSVParser 進口靜態org.apache.commons.csv。 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有很好的API,我推薦。


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

(從它的樣本獲取)


最後一招:正則表達式。

下面是如何解析的文件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

第一種方法失敗,出現'groovy.lang.MissingMethodException:方法沒有簽名:sun.nio.fs.UnixPath.withReader()適用於參數類型:(myscript $ _run_closure1)values:[myscript $ _run_closure1 @ 536f2a7e]' – 2016-09-20 08:33:01

3

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

名稱從CSV文件的標題中獲取的字段。
如果CSV文件沒有標題,則可以通過編程方式指定字段名稱。 ( ':opencsv:com.opencsv 4.0')使用opencsv

@Grab

0

例 進口com.opencsv.CSVReader 進口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() 
    } 
}