LoginSignup
1
0

More than 1 year has passed since last update.

Goでエクセルから読み込んだ情報を変換してファイルに書き出す

Last updated at Posted at 2021-10-20

目標

データベースを更新するために、エクセルの情報を変換してsqlファイルに書き出すスクリプトをGoで書きます。
エクセルファイルの中身は下記です。

id mail
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;
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0