2010-04-12 28 views
26

Cách đọc và nhập tệp .csv trong groovy trên grails. Tôi có tệp .csv với dữ liệu và
cần nhập vào db bằng giao diện người dùng.Tệp Groovy tải .csv

Trả lời

43

Luôn có các khả năng khác nhau để làm việc với tệp CSV trong Groovy.

Khi Groovy hoàn toàn tương thích với Java, bạn có thể sử dụng một trong các thanh công cụ CSV hiện có, ví dụ: OpenCSV.

Tùy thuộc vào sự phức tạp của tệp CSV mà bạn đang sử dụng, bạn cũng có thể sử dụng các khả năng xử lý tập tin/chuỗi tiêu chuẩn của 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 chỉ viết một đẹp blog post về các khả năng khác nhau có sẵn để làm việc với các tệp CSV trong Groovy.

EDIT # 2: Như Leonard Axelsson recently released version 1.0 của thư viện GroovyCVS của mình, tôi nghĩ rằng tôi chắc chắn nên thêm video này vào danh sách tùy chọn.

+2

Tôi đã viết một groovified trình bao bọc xung quanh OpenCSV được gọi là GroovyCSV và làm việc với csv trong Groovy dễ dàng hơn và thành ngữ hơn. Nó có sẵn tại http: // xlson.com/groovycsv/ – xlson

0

Với Apache Commons-CSV:

@Grab ('org.apache.commons: commons-csv: 1.2') nhập khẩu org.apache.commons.csv.CSVParser nhập khẩu org.apache.commons.csv tĩnh. 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 có API tốt và tôi khuyên bạn nên sử dụng.


Với 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 từ các mẫu của nó)


khu nghỉ mát cuối: biểu hiện thường xuyên.

Đây là cách tôi phân tích một tập tin mà 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

Phương thức đầu tiên không thành công với 'groovy.lang.MissingMethodException: Không có chữ ký của phương thức: sun.nio.fs.UnixPath.withReader() được áp dụng cho các kiểu đối số: (myscript $ _run_closure1) values: [myscript $ _run_closure1 @ 536f2a7e] ' –

3

Sử dụng xlson của 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" 
} 

Trường tên được lấy từ tiêu đề của tập tin CSV.
Nếu tệp CSV không có tiêu đề, bạn có thể chỉ định tên trường theo lập trình.

0

Ví dụ sử dụng opencsv

@Grab ('com.opencsv: opencsv: 4,0') nhập khẩu com.opencsv.CSVReader nhập khẩu 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() 
    } 
}