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

## 目標

データベースを更新するために、エクセルの情報を変換して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ファイルを作成
```go
	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ファイルの読み込み
```go
	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ファイルに書き込み
```go
	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 
	}

```

### 最終的なコード
```go
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ファイル
```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;
```