0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?