bash+WSL+MySQLを使用したTXT形式ファイルのDB IMPORT

##1.実行前
==USER IMPORTからEND==迄にUSERテーブルにINSERTしたいデータが格納されている

```DATA_SAMPLE1.TXT
...
==USER IMPORT
ckhaorus      ckhaorus      pawpOMFPAOKWDDK41po2kldaodkPAOWK  
matchan      matchan      HcrUC/zoaeQjF4XLVQbYk1TkHjhHkEkD+z8DFtc9SrY=  
END==

==SCHEDULE IMPORT
2019/10/27 01:42:32
2019/10/27 02:15:16
...
```

##2.処理内容
```text_import_env.sh
#!/bin/bash

### ディレクトリ名
INPUT_DIR="/home/ckhaorus/csv-import/INPUT_DIR"
WORK_DIR="/home/ckhaorus/csv-import/WORK_DIR"

### MYSQL
MYSQL_HOST="127.0.0.1"
MYSQL_USER="root"
MYSQL_PWD="root"
MYSQL_DB="sample"

###返却値
END_STATUS=0 # 正常終了
INVALID_DIRECTORY_STATUS=10 # INPUT_DIR不正

function log(){
  echo -e "$(date '+%Y-%m-%dT%H:%M:%S') $1"
}

function infStr(){
  log "INFO SH10001[]: $1: START[]"
}

function infEnd(){
  log "INFO SH10002[]: $1: END[] STATUS CODE: $2"
  exit "$2"
}

function inputFileIsNotFoundErr(){
  log "ERROR SH20001[]: $1: INPUT FILE IS NOT FOUND."
}
```


```text_import.sh
#!/bin/bash

### ファイル名
CONFIGURATION_FILE="text_import_env.sh"
BASEFILE_NAME="text_import.sh"
### ファイルパターン
INPUT_FILE_PATTERN=".*DATA_[A-Z]+[1-9].TXT.*"
DATA_START_PATTERN="==USER IMPORT"
DATA_END_PATTERN="END=="
LINE_NO_PATTERN="s/:.*//g"

# 設定ファイルの読み込み
source "${CONFIGURATION_FILE}"

# 処理の開始
infStr "${BASEFILE_NAME}"

# INPUT_DIR内にファイルが配置されているか確認
if [ ! "$(ls "${INPUT_DIR}")" ]; then
  # ファイルが配置されていない場合、ERRORログ「SH20001」: INPUT_DIR内にファイルが存在しないを表示し、シェルを終了する。
  inputFileIsNotFoundErr "${BASEFILE_NAME}"
  infEnd "${BASEFILE_NAME}" "${INVALID_DIRECTORY_STATUS}"
fi

# WORK_DIR内の全ディレクトリ・ファイルに対して削除を行い、WORK_DIRを初期化する。
rm -rf "${WORK_DIR:?}/"*

# INPUT_DIRからFILE_PATTERNにマッチする全ファイルに対して、WORK_DIRに移動する。
find "${INPUT_DIR}" -type f -regextype posix-egrep -regex "${INPUT_FILE_PATTERN}" | xargs -I% mv % "${WORK_DIR}"

# WORK_DIR内のFILE_PATTERNにマッチする全ファイルに対してループ
for filepath in $(find "${WORK_DIR}" -type f -regextype posix-egrep -regex "${INPUT_FILE_PATTERN}"); do
  # ファイル名取得
  base_filename=$(basename "${filepath}")
  # 出力ファイル名取得
  data_filename=$(echo "${base_filename}" | cut -d "." -f 1)"_USER.TXT"
  # データの開始～終了行取得
  start_line=$(grep -no "${DATA_START_PATTERN}" "$filepath" | sed -e "${LINE_NO_PATTERN}")
  end_line=$(grep -no "${DATA_END_PATTERN}" "$filepath" | sed -e "${LINE_NO_PATTERN}")
  # 行番号指定でデータを抜き出し、<元ファイル名_USER.TXT>に出力する。
  sed -n "${start_line},${end_line}p" "$filepath" > "${WORK_DIR}/${data_filename}"
done

# user_import.shを起動
bash user_import.sh

# WORK_DIR内の全ディレクトリ・ファイルに対して削除を行い、WORK_DIRを初期化する。
rm -rf "${WORK_DIR:?}/"*

# 処理の終了
infEnd "${BASEFILE_NAME}" "${END_STATUS}"
```

```user_import.sh
#!/bin/bash

### ファイル名
CONFIGURATION_FILE="text_import_env.sh"
BASEFILE_NAME="user_import.sh"

### ファイルパターン
USER_FILE_PATTERN=".*DATA_[A-Z]+[1-9]_USER.TXT.*"

### テーブル名
TEMP_TABLENAME="temp_user"

# 環境設定ファイルの読み込み
source "${CONFIGURATION_FILE}"

# WORK_DIR内のFILE_PATTERNにマッチする全ファイルに対してループ
for filepath in $(find "${WORK_DIR}" -type f -regextype posix-egrep -regex "${USER_FILE_PATTERN}"); do
  while read line; do
    if [[ ${line:0:1} =~ [a-z] ]]; then
      # ファイル名取得
      base_filename=$(basename "$filepath")
      # 出力ファイル名取得
      csv_filename=$(echo "${base_filename}" | cut -d "." -f 1)".CSV"
      # 各カラムの取得
      login_id=$(echo "${line}" | awk '{print $1}')
      name=$(echo "${line}" | awk '{print $2}')
      password=$(echo "${line}" | awk '{print $3}')
      # TODO:LOAD DATA LOCAL INFILE文が使用不可
      # echo "\"${login_id}\",\"${name}\",\"${password}\"" >> "${WORK_DIR}/${csv_filename}"
      # temp_userテーブルに対してINSERTを行う。
      mysql -h "${MYSQL_HOST}" -u"${MYSQL_USER}" -p"${MYSQL_PWD}" --database="${MYSQL_DB}" -e "INSERT INTO ${TEMP_TABLENAME} (login_id, name, password) VALUES ('${login_id}', '${name}', '${password}');"
    fi    
  done < "${filepath}"
done
```

##3.出力
```正常系.sh
2020-10-27T07:56:46 INFO SH10001[]: text_import.sh: START[]
2020-10-27T07:56:47 INFO SH10002[]: text_import.sh: END[] STATUS CODE: 0
```

```異常系.sh
2020-10-27T07:57:26 INFO SH10001[]: text_import.sh: START[]
2020-10-27T07:57:26 ERROR SH20001[]: text_import.sh: INPUT FILE IS NOT FOUND.
2020-10-27T07:57:26 INFO SH10002[]: text_import.sh: END[] STATUS CODE: 10
```