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