かんがるーさんの日記

最近自分が興味をもったものを調べた時の手順等を書いています。今は Spring Boot をいじっています。

Grooy スクリプトをそのまま渡して実行する Spring Boot+Picocli ベースのコマンドラインアプリを作成する ( その5 )( CSV ファイルのデータをテーブルに登録する Groovy スクリプトを作成する )

概要

記事一覧はこちらです。

Grooy スクリプトをそのまま渡して実行する Spring Boot+Picocli ベースのコマンドラインアプリを作成する ( その4 )( テーブルのデータを CSV フォーマットで出力する Groovy スクリプトを作成する ) の続きです。

  • 今回の手順で確認できるのは以下の内容です。
    • CSV ファイルのデータを MySQL の testdb の book テーブルに登録する Groovy スクリプトを作成します。

参照したサイト・書籍

目次

  1. CSV ファイルのデータを MySQL の testdb の book テーブルに登録する

手順

CSV ファイルのデータを MySQL の testdb の book テーブルに登録する

groovy-script-executor/src/main/groovy/sample の下に CsvFileToBookTable.groovy を新規作成し、以下のコードを記述します。

  • 今回は commit を明記する方式にします。トランザクションの処理が始まる前に sql.connection.autoCommit = false を記述して AutoCommit を OFF にします。
  • CSV ファイルの publications.csv は PublicationsTableToFileUsingUnivocityParsers.groovy が出力したファイルを使用します。ただしそのままだと全部で 154,729件あって多いので、先頭から 20件だけ使用します。
  • publications.csv の title_author には title だけか、/ を区切り文字として title と authror が入っているので、/ で分割して author はデータがある時だけセットします。
package sample

import com.univocity.parsers.annotations.Parsed
import com.univocity.parsers.common.processor.BeanListProcessor
import com.univocity.parsers.csv.CsvParserSettings
import com.univocity.parsers.csv.CsvRoutines
import groovy.sql.Sql

class CsvFileToBookTable {

    static class CsvRecord {
        @Parsed(index = 0, field = "isbm")
        String isbm
        @Parsed(index = 1, field = "title_author")
        String title_author
    }

    static void main(args) {
        def sql = Sql.newInstance("jdbc:mysql://localhost:3306/testdb?sslMode=DISABLED&characterEncoding=utf8",
                "testdb_user",
                "xxxxxxxx",
                "org.mariadb.jdbc.Driver")
        sql.connection.autoCommit = false

        CsvParserSettings settings = new CsvParserSettings()
        settings.format.lineSeparator = "\r\n"
        settings.headerExtractionEnabled = true
        BeanListProcessor<CsvRecord> rowProcessor = new BeanListProcessor<>(CsvRecord)
        settings.processor = rowProcessor

        sql.execute("truncate table book")

        new File("publications.csv").withReader { reader ->
            CsvRoutines csvRoutines = new CsvRoutines(settings)
            for (CsvRecord csvRecord : csvRoutines.iterate(CsvRecord, reader)) {
                String[] titleAndAuthor = csvRecord.title_author.split(" / ")
                sql.execute("""
                                insert into book (isbm, title, author)
                                values (:isbm, :title, :author)
                            """,
                        isbm: csvRecord.isbm,
                        title: titleAndAuthor[0],
                        author: titleAndAuthor.size() == 2 ? titleAndAuthor[1] : null)
            }
        }

        sql.commit()
        sql.close()
    }

}

CsvFileToBookTable.groovy を D:\tmp にコピーし gse CsvFileToBookTable.groovy を実行すると book テーブルにデータが登録されます。

f:id:ksby:20211107172250p:plain

履歴

2021/11/07
初版発行。