GrailsのGroovyで.csvファイルを読み込んでインポートする方法。データを含む.csvファイルと
ユーザーインターフェイスを使用してdbにインポートする必要があります。
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:ケリー・ロビンソンは、GroovyでCSVファイルを操作できるさまざまな可能性について、ニース ブログ投稿 を書きました。
EDIT#2:Leonov Axelsson 最近リリースされたバージョン1. 彼のGroovyCVSライブラリのように、私は間違いなくこれをオプションのリスト。
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を使用した例
@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()
}
}
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にはNice 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"
}
(サンプルから取得)
最終手段:正規表現。
引用符で囲まれたエスケープ文字列が4列目に含まれている可能性があります というファイルを解析した方法は次のとおりです。
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('\\"','"');
私は受け入れられた答えを少し調整することを好みます:番号でそれぞれをインデックス化するのではなく、列と値を一緒に圧縮します。結果は、わずかに短いコードです。
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())
}