目標
データベースを更新するために、エクセルの情報を変換してsqlファイルに書き出すスクリプトをGoで書きます。
エクセルファイルの中身は下記です。
id | |
---|---|
0001 | gojou@satoru.u-jujutsu.co.jp |
0002 | ryoumen@sukuna.u-jujutsu.co.jp |
0003 | itadori@yuuji.u-jujutsu.co.jp |
0004 | fushiguro@megumi.u-jujutsu.co.jp |
yyyyMMddHHmm形式のファイル名のsqlファイルを作成
t := time.Now().Format("200601021504")
file, err := os.Create("/hoge/fuga/" + t + ".sql")
if err != nil {
fmt.Println("ファイルが作成できませんでした。")
os.Exit(1)
}
fmt.Printf("ファイルを作成しました。\n%v\n", file)
defer file.Close()
EXCELファイルの読み込み
f, err := excelize.OpenFile("../../example.xlsx") // カレントディレクトリから読みたいエクセルまでのパス
if err != nil {
fmt.Println(err)
return
}
rows, err := f.GetRows("Sheet1") // 読みたいシート名を指定
if err != nil {
fmt.Println(err)
return
}
エクセルの行でループ、sqlファイルに書き込み
for _, row := range rows {
if row[1] == "" { // メールアドレスが空のデータをスキップ
continue
}
replaceDotToAt := strings.Replace(row[1], ".", "@", 1) //最初の.を@に変換(gojou@satoru@u-jujutsu.co.jpになる)
replaced := strings.Replace(replaceDotToAt, "@", ".", 1) //最初の@を.に変換(gojou.satoru@u-jujutsu.co.jpになる)
updateText := "UPDATE account SET login_id = '" + replaced + "' WHERE login_id = '" + row[0] + "';\n"
// 作成したファイルに書き込み
_, err = file.WriteString(updateText)
if err != nil {
panic(err)
}
}
err := writer.Flush()
if err != nil {
return
}
最終的なコード
package main
import (
"bufio"
"fmt"
"os"
"strings"
"time"
"github.com/xuri/excelize/v2"
)
func main() {
// alterディレクトリに今の日時をファイル名とするsqlファイルを作成
t := time.Now().Format("200601021504")
file, err := os.Create("/hoge/fuga/" + t + ".sql")
if err != nil {
fmt.Println("ファイルが作成できませんでした。")
os.Exit(1)
}
fmt.Printf("ファイルを作成しました。\n%v\n", file)
defer file.Close()
writer := bufio.NewWriter(file)
// 作成したファイルにトランザクションの開始を書き込み
_, err = file.WriteString("BEGIN WORK;\n")
if err != nil {
panic(err)
}
// EXCELファイルを読み込み
f, err := excelize.OpenFile("../../example.xlsx")
if err != nil {
fmt.Println(err)
return
}
// 読み込むシートを指定
rows, err := f.GetRows("Sheet1")
if err != nil {
fmt.Println(err)
return
}
// 行でループ
for _, row := range rows {
// アドレスが空の行は飛ばす
if row[1] == "" {
continue
}
replaceDotToAt := strings.Replace(row[1], ".", "@", 1) //最初の.を@に変換(gojou@satoru@u-jujutsu.co.jpになる)
replaced := strings.Replace(replaceDotToAt, "@", ".", 1) //最初の@を.に変換(gojou.satoru@u-jujutsu.co.jpになる)
updateText := "UPDATE account SET login_id = '" + replaced + "' WHERE address = '" + row[0] + "';\n"
// 作成したファイルに書き込み
_, err = file.WriteString(updateText)
if err != nil {
panic(err)
}
}
// トランザクションの終了を書き込み
_, err = file.WriteString("COMMIT;")
if err != nil {
panic(err)
}
err := writer.Flush()
if err != nil {
return
}
}
作成されたsqlファイル
BEGIN WORK;
UPDATE account SET address = 'gojou.satoru@u-jujutsu.co.jp' WHERE login_id = '0001';
UPDATE account SET address = 'ryoumen.sukuna@u-jujutsu.co.jp' WHERE login_id = '0002';
UPDATE account SET address = 'itadori.yuuji@u-jujutsu.co.jp' WHERE login_id = '0003';
UPDATE account SET address = 'fushiguro.megumi@u-jujutsu.co.jp' WHERE login_id = '0005';
COMMIT;