87 lines
3.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from datetime import datetime
import boto3
import io
import csv
from error import error
s3_resource = boto3.resource('s3')
LOG_LEVEL = {'i': 'Info', 'e': 'Error'}
SETTINGS_ITEM = {
'dataSource': 0,
'delimiter': 1,
'charCode': 2,
'quotechar': 3,
'lineFeedCode': 4,
'headerFlag': 5,
'csvNumItems': 6,
'csvNameItems': 7,
'dbColumuName': 8,
'storageSchemaName': 9,
'loadSchemaName': 10,
'exSqlFileName': 11,
}
class CheckError(Exception):
pass
def check(bucket_name, target_key, target_data_source, target_file_name, settings_key, log_info):
"""チェック処理
Args:
bucket_name : バケット名
target_key : 投入データのフルパス
target_data_source : 投入データのディレクトリ名よりデータソースに該当する部分
target_file_name : 投入データのファイル名
settings_key : 投入データに該当する個別設定ファイルのフルパス
log_info : ログに記載するデータソース名とファイル名
Raises:
CheckError : チェックでエラーがあった場合に発生する例外
"""
# ① 開始ログの出力
print(f'{str(datetime.now())} {log_info} {LOG_LEVEL["i"]} I-CHK-01 - チェック処理を開始します')
try:
# データ読込
settings_obj = s3_resource.Object(bucket_name, settings_key)
settings_response = settings_obj.get()
settings_list = []
for line in io.TextIOWrapper(io.BytesIO(settings_response["Body"].read()), encoding='utf-8'):
settings_list.append(line.rstrip())
target_obj = s3_resource.Object(bucket_name, target_key)
target_response = target_obj.get()
target_data = io.TextIOWrapper(io.BytesIO(target_response["Body"].read()), encoding=settings_list[SETTINGS_ITEM["charCode"]], newline=settings_list[SETTINGS_ITEM["lineFeedCode"]])
for line in csv.reader(target_data, quotechar=settings_list[SETTINGS_ITEM["quotechar"]], delimiter=settings_list[SETTINGS_ITEM["delimiter"]]):
target_header_list = line.rstrip()
break
# ② C-1 項目数チェック
print(f'{str(datetime.now())} {log_info} {LOG_LEVEL["i"]} I-CHK-02 - C-1のチェックを開始します')
target_header_list_len = len(target_header_list)
if not target_header_list_len == int(settings_list[SETTINGS_ITEM["csvNumItems"]]):
print(f'{str(datetime.now())} {log_info} {LOG_LEVEL["i"]} I-CHK-03 - C-1正常終了')
else:
raise CheckError('E-CHK-01 - 項目数が一致しません')
# ③ C-2 項目並び順チェック
if int(settings_list[SETTINGS_ITEM["headerFlag"]]) == True:
print(f'{str(datetime.now())} {log_info} {LOG_LEVEL["i"]} I-CHK-04 - C-2のチェックを開始します')
settings_header_list = settings_list[SETTINGS_ITEM["csvNameItems"]].rstrip().split(',')
for i in range(len(settings_header_list)):
if not settings_header_list[i] == target_header_list[i]:
raise CheckError('E-CHK-02 - 項目順序が一致しません')
print(f'{str(datetime.now())} {log_info} {LOG_LEVEL["i"]} I-CHK-05 - C-2正常終了')
except CheckError as e:
print(f'{str(datetime.now())} {log_info} {LOG_LEVEL["e"]} {e}')
error(bucket_name, target_data_source, target_file_name)
except Exception as e:
print(f'{str(datetime.now())} {log_info} {LOG_LEVEL["e"]} E-CHK-99 - エラー内容:{e}')
error(bucket_name, target_data_source, target_file_name)
# ④ 終了ログの出力
print(f'{str(datetime.now())} {log_info} {LOG_LEVEL["i"]} I-CHK-06 - チェック処理を終了します')