Groovy загрузки CSV-файлов - PullRequest
       14

Groovy загрузки CSV-файлов

34 голосов
/ 12 апреля 2010

Как читать и импортировать файл .csv в Groovy на Grails. У меня есть файл .csv с данными и
необходимо импортировать в БД с использованием пользовательского интерфейса.

Ответы [ 5 ]

53 голосов
/ 12 апреля 2010

В 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]
  )
}

EDIT: Келли Робинсон только что написала сообщение в блоге о различных возможностях работы с файлами CSV в Groovy.

РЕДАКТИРОВАНИЕ № 2: Поскольку Леонард Аксельссон недавно выпустил версию 1.0 своей библиотеки GroovyCVS, я подумал, что обязательно должен добавить это в список параметров.

9 голосов
/ 20 сентября 2016

Использование xlson's 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 не имеет заголовка, вы можете указать имена полей программно.

1 голос
/ 16 ноября 2017

Пример использования 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 голос
/ 02 мая 2016

С 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 имеет хороший API, и я рекомендую.1010 *:

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

(взято из его образцов)


Последнее средство: регулярное выражение.

Вот как я проанализировал файл, который может содержит экранированную строку в четвертом столбце :

    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 голосов
/ 28 июля 2018

Я предпочитаю немного изменить принятый ответ: объединить столбцы и значения вместе, а не индексировать каждый по номеру. Результат немного короче код.

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())
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...