Merge pull request #498 feature-NEWDWH2021-1917 into develop

This commit is contained in:
小野 祥照 2025-06-11 08:39:01 +09:00
commit c6d7344307
38 changed files with 262 additions and 210 deletions

View File

@ -2,57 +2,17 @@ import csv
import io import io
import os import os
import sys import sys
import zipfile
from datetime import datetime from datetime import datetime
import boto3 import boto3
from common import convert_quotechar, debug_log from common import (ERROR, INFO, LINE_FEED_CODE, SETTINGS_ITEM,
convert_quotechar, debug_log, uncompress_gzip,
uncompress_zip)
from end import end from end import end
from error import error from error import error
# 定数 # 定数
DIRECTORY_WORK = '/work/' DIRECTORY_WORK = '/work/'
LOCAL_DIRECTORY_TMP = '/tmp'
# チェック処理で解凍した圧縮ファイルの中身を格納するフォルダ
LOCAL_TEMPORARY_FILE_PATH = f'{LOCAL_DIRECTORY_TMP}/temporary_file.dat'
LOG_LEVEL = {'i': 'Info', 'e': 'Error', 'w': "Warning"}
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,
'commaReplaceColumns': 12,
'importManner': 13,
'bulkImportFlag': 14,
'compressedFlag': 15,
'compression': 16,
'reserved1': 17,
'reserved2': 18,
'reserved3': 19,
'reserved4': 20,
'reserved5': 21,
'reserved6': 22,
'reserved7': 23,
'reserved8': 24
}
LINE_FEED_CODE = {
'CR': '\r',
'LF': '\n',
'CRLF': '\r\n',
}
INFO = LOG_LEVEL["i"]
ERROR = LOG_LEVEL["e"]
WARNING = LOG_LEVEL["w"]
# クラス変数 # クラス変数
s3_client = boto3.client('s3') s3_client = boto3.client('s3')
@ -222,7 +182,7 @@ def is_empty_file(work_csv_row: list, settings_list: list):
return len(work_csv_row) == 0 return len(work_csv_row) == 0
def uncompress_file(work_data_file: bytes, settings_list: list, log_info) -> bytes: def uncompress_file(work_data_file: io.BytesIO, settings_list: list, log_info) -> bytes:
"""指定された形式で圧縮ファイルを展開し、ローカルに書き出す。 """指定された形式で圧縮ファイルを展開し、ローカルに書き出す。
Args: Args:
work_data_file (bytes): S3から読み込んだ登録 work_data_file (bytes): S3から読み込んだ登録
@ -236,50 +196,21 @@ def uncompress_file(work_data_file: bytes, settings_list: list, log_info) -> byt
print( print(
f'{datetime.now():%Y-%m-%d %H:%M:%S} {log_info} {INFO} I-CHK-11 - 投入ファイルが圧縮されているため、展開処理を行います。圧縮形式:{compression}') f'{datetime.now():%Y-%m-%d %H:%M:%S} {log_info} {INFO} I-CHK-11 - 投入ファイルが圧縮されているため、展開処理を行います。圧縮形式:{compression}')
file_bytes: bytes = None
if compression == 'zip': if compression == 'zip':
file_bytes = None # zipファイルを展開し、ファイルを書き出す。
with zipfile.ZipFile(work_data_file, 'r') as zip_ref: file_bytes = uncompress_zip(work_data_file, settings_list, log_info)
# 昇順でソートする。 elif compression == 'gzip':
file_list: list[str] = sorted(zip_ref.namelist()) file_bytes = uncompress_gzip(work_data_file, settings_list, log_info)
if len(file_list) > 1:
# 圧縮ファイル内に複数ファイルが存在する場合、warningログを出力する。
print(
f'{datetime.now():%Y-%m-%d %H:%M:%S} {log_info} {WARNING} W-CHK-01 - 圧縮データ内に複数ファイルが存在したため、{file_list[0]}のみ登録を行います。')
target_file_name = file_list[0]
# 末尾が「/」で終わるのはフォルダ
if target_file_name.endswith('/'):
# 圧縮ファイル内の先頭がフォルダの場合、エラー処理を行う。
raise Exception(
f'展開したデータはファイルではありません。ファイルパス: {target_file_name}')
# zipファイル内には1ファイルのみ
with zip_ref.open(target_file_name) as file:
file_bytes = file.read()
# ファイルを一時ディレクトリに書き出す。
encoding = settings_list[SETTINGS_ITEM["charCode"]]
line_feed = LINE_FEED_CODE[settings_list[SETTINGS_ITEM["lineFeedCode"]]]
delimiter = settings_list[SETTINGS_ITEM["delimiter"]]
quote_char = convert_quotechar(
settings_list[SETTINGS_ITEM["quotechar"]])
uncompressed_file = io.TextIOWrapper(io.BytesIO(file_bytes), encoding=encoding,
newline=line_feed)
csv_reader = csv.reader(uncompressed_file, quotechar=convert_quotechar(settings_list[SETTINGS_ITEM["quotechar"]]),
delimiter=delimiter)
with open(LOCAL_TEMPORARY_FILE_PATH, 'w', encoding=encoding, newline='') as csvfile:
csv_writer = csv.writer(csvfile, quotechar=quote_char,
delimiter=delimiter)
for row in csv_reader:
csv_writer.writerow(row)
print(
f'{datetime.now():%Y-%m-%d %H:%M:%S} {log_info} {INFO} I-CHK-12 - 投入ファイルの展開が正常終了しました')
return file_bytes
# MEMO: zip以外の圧縮形式に対応する際に追記すること # MEMO: zip以外の圧縮形式に対応する際に追記すること
else: else:
raise ValueError("圧縮形式が一致しません") raise ValueError("圧縮形式が一致しません")
print(
f'{datetime.now():%Y-%m-%d %H:%M:%S} {log_info} {INFO} I-CHK-12 - 投入ファイルの展開が正常終了しました')
return file_bytes
def reverse_readline_stream(f: io.BytesIO, line_feed: str, chunk_size=4096): def reverse_readline_stream(f: io.BytesIO, line_feed: str, chunk_size=4096):
"""バイトモードのファイルストリームを後ろから読み、1行ずつ返すジェネレータ。 """バイトモードのファイルストリームを後ろから読み、1行ずつ返すジェネレータ。
@ -331,12 +262,12 @@ def reverse_readline_stream(f: io.BytesIO, line_feed: str, chunk_size=4096):
# ローカル実行用コード # ローカル実行用コード
# 値はよしなに変えてください # 値はよしなに変えてください
# if __name__ == '__main__': if __name__ == '__main__':
# check( check(
# bucket_name='バケット名', bucket_name='test-shimoda-bucket',
# target_data_source='データソース名', target_data_source='test',
# target_file_name='targetフォルダ内のファイル名', target_file_name='compress_test.gz',
# settings_key='個別設定ファイル名', settings_key='test/settings/compress_test_gzip.txt',
# log_info='Info', log_info='Info',
# mode='i' mode='i'
# ) )

View File

@ -1,16 +1,81 @@
import csv
import gzip
import io
import zipfile
from datetime import datetime from datetime import datetime
# 定数 # 定数
LOG_LEVEL = {"d": 'Debug'} LOG_LEVEL = {
"d": 'Debug',
'i': 'Info',
'e': 'Error',
'w': "Warning"
}
INFO = LOG_LEVEL["i"]
ERROR = LOG_LEVEL["e"]
WARNING = LOG_LEVEL["w"]
LINE_FEED_CODE = {
'CR': '\r',
'LF': '\n',
'CRLF': '\r\n',
}
# LOAD DATA文で文字コードを指定するために、個別設定ファイルの文字コード指定をMySQLの文字コード表記に変換する
MYSQL_CHARSET_CODE = {
'utf-8': 'utf8mb4',
'utf8': 'utf8mb4',
'utf-8-sig': 'utf8mb4',
'shift_jis': 'cp932',
'cp932': 'cp932',
}
MODE_TYPE = { MODE_TYPE = {
'n': 'normal', 'n': 'normal',
'd': 'debug', 'd': 'debug',
} }
# 設定ファイルのの項目行数のマップ
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,
'commaReplaceColumns': 12,
'importManner': 13,
'bulkImportFlag': 14,
'compressedFlag': 15,
'compression': 16,
'reserved1': 17,
'reserved2': 18,
'reserved3': 19,
'reserved4': 20,
'reserved5': 21,
'reserved6': 22,
'reserved7': 23,
'reserved8': 24
}
LOCAL_DIRECTORY_TMP = '/tmp'
# チェック処理で解凍した圧縮ファイルの中身を格納するフォルダ
LOCAL_TEMPORARY_FILE_PATH = f'{LOCAL_DIRECTORY_TMP}/temporary_file.dat'
def debug_log(log, log_info, mode): def debug_log(log, log_info, mode):
if MODE_TYPE['d'] == mode: if MODE_TYPE['d'] == mode:
print(f'{datetime.now():%Y-%m-%d %H:%M:%S} {log_info} {LOG_LEVEL["d"]} {log}') print(
f'{datetime.now():%Y-%m-%d %H:%M:%S} {log_info} {LOG_LEVEL["d"]} {log}')
def convert_quotechar(quotechar): def convert_quotechar(quotechar):
"""csvモジュールの囲い文字を変換する """csvモジュールの囲い文字を変換する
@ -26,3 +91,105 @@ def convert_quotechar(quotechar):
return None return None
return quotechar return quotechar
def uncompress_zip(work_data_file: io.BytesIO, settings_list: list, log_info) -> bytes:
"""zip圧縮されているファイルを展開する
Args:
work_data_file (io.BytesIO): 展開対象のバイナリ(.zip)
settings_list (list): 個別設定ファイルの情報
log_info (_type_): ログ情報
Raises:
Exception: 展開したものがファイルではなかった場合
Returns:
bytes: 展開後ファイルのバイナリ
"""
file_bytes = None
with zipfile.ZipFile(work_data_file, 'r') as zip_ref:
# 昇順でソートする。
file_list: list[str] = sorted(zip_ref.namelist())
if len(file_list) > 1:
# 圧縮ファイル内に複数ファイルが存在する場合、warningログを出力する。
print(
f'{datetime.now():%Y-%m-%d %H:%M:%S} {log_info} {WARNING}' +
f'W-CHK-01 - 圧縮データ内に複数ファイルが存在したため、{file_list[0]}のみ登録を行います。'
)
target_file_name = file_list[0]
# 末尾が「/」で終わるのはフォルダ
if target_file_name.endswith('/'):
# 圧縮ファイル内の先頭がフォルダの場合、エラー処理を行う。
raise Exception(
f'展開したデータはファイルではありません。ファイルパス: {target_file_name}')
# zipファイル内には1ファイルのみ
with zip_ref.open(target_file_name) as file:
file_bytes = file.read()
# ファイルを一時ディレクトリに書き出す。
encoding = settings_list[SETTINGS_ITEM["charCode"]]
line_feed = LINE_FEED_CODE[settings_list[SETTINGS_ITEM["lineFeedCode"]]]
delimiter = settings_list[SETTINGS_ITEM["delimiter"]]
quote_char = convert_quotechar(
settings_list[SETTINGS_ITEM["quotechar"]])
uncompressed_file = io.TextIOWrapper(io.BytesIO(file_bytes), encoding=encoding,
newline=line_feed)
csv_reader = csv.reader(uncompressed_file, quotechar=convert_quotechar(settings_list[SETTINGS_ITEM["quotechar"]]),
delimiter=delimiter)
with open(LOCAL_TEMPORARY_FILE_PATH, 'w', encoding=encoding, newline='') as csvfile:
csv_writer = csv.writer(csvfile, quotechar=quote_char,
delimiter=delimiter)
for row in csv_reader:
csv_writer.writerow(row)
def uncompress_gzip(work_data_file: io.BytesIO, settings_list: list, log_info) -> bytes:
"""gzip 圧縮されたファイルを展開する
Args:
work_data_file (io.BytesIO): 展開対象のバイナリ (.gz)
settings_list (list): 個別設定ファイルの情報
log_info (_type_): ログ情報
Raises:
Exception: 展開に失敗した場合
Returns:
bytes: 展開後ファイルのバイナリ
"""
gz_bytes = work_data_file.getvalue()
try:
# GZIP をバイト列ごと展開する
file_bytes = gzip.decompress(gz_bytes)
except (OSError, EOFError) as e:
raise Exception(f"GZIP 解凍に失敗しました: {e}")
# ファイルを一時ディレクトリに書き出す。
encoding = settings_list[SETTINGS_ITEM["charCode"]]
line_feed = LINE_FEED_CODE[settings_list[SETTINGS_ITEM["lineFeedCode"]]]
delimiter = settings_list[SETTINGS_ITEM["delimiter"]]
quote_char = convert_quotechar(settings_list[SETTINGS_ITEM["quotechar"]])
uncompressed_file = io.TextIOWrapper(
io.BytesIO(file_bytes),
encoding=encoding,
newline=line_feed
)
csv_reader = csv.reader(
uncompressed_file,
quotechar=convert_quotechar(settings_list[SETTINGS_ITEM["quotechar"]]),
delimiter=delimiter
)
with open(LOCAL_TEMPORARY_FILE_PATH, 'w', encoding=encoding, newline='') as csvfile:
csv_writer = csv.writer(
csvfile, quotechar=quote_char, delimiter=delimiter)
for row in csv_reader:
csv_writer.writerow(row)
return file_bytes

View File

@ -4,66 +4,20 @@ from datetime import datetime
import boto3 import boto3
import pymysql import pymysql
from chk import LOCAL_TEMPORARY_FILE_PATH from common import (ERROR, INFO, LINE_FEED_CODE, LOCAL_TEMPORARY_FILE_PATH,
from common import convert_quotechar, debug_log MYSQL_CHARSET_CODE, SETTINGS_ITEM, WARNING,
convert_quotechar, debug_log)
from error import error from error import error
from pymysql.constants import CLIENT from pymysql.constants import CLIENT
# 定数 # 定数
DIRECTORY_WORK = '/work/' DIRECTORY_WORK = '/work/'
LOG_LEVEL = {"i": 'Info', "e": 'Error', "w": 'Warning'}
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,
'commaReplaceColumns': 12,
'importManner': 13,
'bulkImportFlag': 14,
'compressedFlag': 15,
'compression': 16,
'reserved1': 17,
'reserved2': 18,
'reserved3': 19,
'reserved4': 20,
'reserved5': 21,
'reserved6': 22,
'reserved7': 23,
'reserved8': 24
}
LINE_FEED_CODE = {
'CR': '\r',
'LF': '\n',
'CRLF': '\r\n',
}
# LOAD DATA文で文字コードを指定するために、個別設定ファイルの文字コード指定をMySQLの文字コード表記に変換する
MYSQL_CHARSET_CODE = {
'utf-8': 'utf8mb4',
'utf8': 'utf8mb4',
'utf-8-sig': 'utf8mb4',
'shift_jis': 'cp932',
'cp932': 'cp932',
}
DIRECTORY_SETTINGS = '/settings/' DIRECTORY_SETTINGS = '/settings/'
TRUNCATE_SRC_TABLE_SYMBOL = 'truncate_src_table:' TRUNCATE_SRC_TABLE_SYMBOL = 'truncate_src_table:'
TRUNCATE_SRC_TABLE_IDENTIFY_SYMBOL_FORMAT = f'{TRUNCATE_SRC_TABLE_SYMBOL}[蓄積スキーマのテーブル名]' TRUNCATE_SRC_TABLE_IDENTIFY_SYMBOL_FORMAT = f'{TRUNCATE_SRC_TABLE_SYMBOL}[蓄積スキーマのテーブル名]'
INVALID_CONFIG_EXCEPTION_MESSAGE = f'個別設定ファイルのインポート方法に不備がありました。 インポート方法は "{TRUNCATE_SRC_TABLE_IDENTIFY_SYMBOL_FORMAT}" のように設定してください' INVALID_CONFIG_EXCEPTION_MESSAGE = f'個別設定ファイルのインポート方法に不備がありました。 インポート方法は "{TRUNCATE_SRC_TABLE_IDENTIFY_SYMBOL_FORMAT}" のように設定してください'
INFO = LOG_LEVEL['i']
WARNING = LOG_LEVEL['w']
ERROR = LOG_LEVEL['e']
# クラス変数 # クラス変数
s3_client = boto3.client('s3') s3_client = boto3.client('s3')

View File

@ -14,4 +14,4 @@ ATC_PHARM_ex.sql
truncate_src_table:src07.atc_pharm truncate_src_table:src07.atc_pharm
1 1
1 1
zip gzip

View File

@ -14,4 +14,4 @@ CUSTOMER_LOTNO_ALL_ex.sql
truncate_src_table:src07.customer_lotno_all truncate_src_table:src07.customer_lotno_all
1 1
1 1
zip gzip

View File

@ -14,4 +14,4 @@ EMP_ex.sql
truncate_src_table:src07.emp truncate_src_table:src07.emp
1 1
1 1
zip gzip

View File

@ -14,4 +14,4 @@ HST_RESULT_DATA_ex.sql
truncate_src_table:src07.hst_result_data truncate_src_table:src07.hst_result_data
1 1
1 1
zip gzip

View File

@ -14,4 +14,4 @@ IM_PLN_PROD_ex.sql
truncate_src_table:src07.im_pln_prod truncate_src_table:src07.im_pln_prod
1 1
1 1
zip gzip

View File

@ -14,4 +14,4 @@ INST_IM_PLN_ex.sql
truncate_src_table:src07.inst_im_pln truncate_src_table:src07.inst_im_pln
1 1
1 1
zip gzip

View File

@ -14,4 +14,4 @@ MR_YR_PLN_INST_KY_ex.sql
truncate_src_table:src07.mr_yr_pln_inst_ky truncate_src_table:src07.mr_yr_pln_inst_ky
1 1
1 1
zip gzip

View File

@ -14,4 +14,4 @@ MST_ASSN_PROD_GRP_ex.sql
truncate_src_table:src07.mst_assn_prod_grp truncate_src_table:src07.mst_assn_prod_grp
1 1
1 1
zip gzip

View File

@ -14,4 +14,4 @@ MST_ATC_PHARM_PROD_GRP_ex.sql
truncate_src_table:src07.mst_atc_pharm_prod_grp truncate_src_table:src07.mst_atc_pharm_prod_grp
1 1
1 1
zip gzip

View File

@ -14,4 +14,4 @@ MST_COMPANY_ex.sql
truncate_src_table:src07.mst_company truncate_src_table:src07.mst_company
1 1
1 1
zip gzip

View File

@ -14,4 +14,4 @@ MST_COMPANY_GRP_ex.sql
truncate_src_table:src07.mst_company_grp truncate_src_table:src07.mst_company_grp
1 1
1 1
zip gzip

View File

@ -14,4 +14,4 @@ MST_DEAL_DIV_ex.sql
truncate_src_table:src07.mst_deal_div truncate_src_table:src07.mst_deal_div
1 1
1 1
zip gzip

View File

@ -14,4 +14,4 @@ MST_GENERAL_ex.sql
truncate_src_table:src07.mst_general truncate_src_table:src07.mst_general
1 1
1 1
zip gzip

View File

@ -14,4 +14,4 @@ MST_INST_ASSN_ex.sql
truncate_src_table:src07.mst_inst_assn truncate_src_table:src07.mst_inst_assn
1 1
1 1
zip gzip

View File

@ -14,4 +14,4 @@ MST_INST_MERCK_ex.sql
truncate_src_table:src07.mst_inst_merck truncate_src_table:src07.mst_inst_merck
1 1
1 1
zip gzip

View File

@ -14,4 +14,4 @@ MST_JIS_CITY_ex.sql
truncate_src_table:src07.mst_jis_city truncate_src_table:src07.mst_jis_city
1 1
1 1
zip gzip

View File

@ -14,4 +14,4 @@ MST_JIS_PREF_ex.sql
truncate_src_table:src07.mst_jis_pref truncate_src_table:src07.mst_jis_pref
1 1
1 1
zip gzip

View File

@ -14,4 +14,4 @@ MST_PROD_PKG_ex.sql
truncate_src_table:src07.mst_prod_pkg truncate_src_table:src07.mst_prod_pkg
1 1
1 1
zip gzip

View File

@ -14,4 +14,4 @@ MST_SALES_PLACE_ex.sql
truncate_src_table:src07.mst_sales_place truncate_src_table:src07.mst_sales_place
1 1
1 1
zip gzip

View File

@ -14,4 +14,4 @@ MST_WAREHOUSE_ex.sql
truncate_src_table:src07.mst_warehouse truncate_src_table:src07.mst_warehouse
1 1
1 1
zip gzip

View File

@ -14,4 +14,4 @@ MST_WHLSLR_ex.sql
truncate_src_table:src07.mst_whlslr truncate_src_table:src07.mst_whlslr
1 1
1 1
zip gzip

View File

@ -14,4 +14,4 @@ ORG_LVL1_ex.sql
truncate_src_table:src07.org_lvl1 truncate_src_table:src07.org_lvl1
1 1
1 1
zip gzip

View File

@ -14,4 +14,4 @@ ORG_LVL2_ex.sql
truncate_src_table:src07.org_lvl2 truncate_src_table:src07.org_lvl2
1 1
1 1
zip gzip

View File

@ -14,4 +14,4 @@ ORG_LVL3_ex.sql
truncate_src_table:src07.org_lvl3 truncate_src_table:src07.org_lvl3
1 1
1 1
zip gzip

View File

@ -14,4 +14,4 @@ ORG_LVL4_ex.sql
truncate_src_table:src07.org_lvl4 truncate_src_table:src07.org_lvl4
1 1
1 1
zip gzip

View File

@ -14,4 +14,4 @@ PROD_ASSN_TEAM_ex.sql
truncate_src_table:src07.prod_assn_team truncate_src_table:src07.prod_assn_team
1 1
1 1
zip gzip

View File

@ -14,4 +14,4 @@ PROD_PRICE_ex.sql
truncate_src_table:src07.prod_price truncate_src_table:src07.prod_price
1 1
1 1
zip gzip

View File

@ -14,4 +14,4 @@ TRN_RESULT_DATA_ex.sqlTRN_RESULT_DATA_ex.sql
truncate_src_table:src07.trn_result_data truncate_src_table:src07.trn_result_data
1 1
1 1
zip gzip

View File

@ -14,4 +14,4 @@ TRN_RESULT_DATA_BIO_ex.sql
1 1
1 1
zip gzip

View File

@ -14,4 +14,4 @@ TRN_Recive_Inventry_ex.sql
1 1
1 1
zip gzip

View File

@ -14,4 +14,4 @@ WHLSLR_LVL1_ex.sql
truncate_src_table:src07.whlslr_lvl1 truncate_src_table:src07.whlslr_lvl1
1 1
1 1
zip gzip

View File

@ -14,4 +14,4 @@ WHLSLR_LVL2_ex.sql
truncate_src_table:src07.whlslr_lvl2 truncate_src_table:src07.whlslr_lvl2
1 1
1 1
zip gzip

View File

@ -14,4 +14,4 @@ WHLSLR_LVL3_ex.sql
truncate_src_table:src07.whlslr_lvl3 truncate_src_table:src07.whlslr_lvl3
1 1
1 1
zip gzip

View File

@ -14,4 +14,4 @@ WHLSLR_LVL4_ex.sql
truncate_src_table:src07.whlslr_lvl4 truncate_src_table:src07.whlslr_lvl4
1 1
1 1
zip gzip

View File

@ -1,35 +1,35 @@
/* 【実消化連携】 */ /* 【実消化連携】 */
TRN_RESULT_DATA_[0-9]{14}\.(ZIP|zip) TRN_RESULT_DATA.txt TRN_RESULT_DATA_[0-9]{14}\.(GZ|gz) TRN_RESULT_DATA.txt
HST_RESULT_DATA_[0-9]{14}\.(ZIP|zip) HST_RESULT_DATA.txt HST_RESULT_DATA_[0-9]{14}\.(GZ|gz) HST_RESULT_DATA.txt
TRN_RESULT_DATA_BIO_[0-9]{14}\.(ZIP|zip) TRN_RESULT_DATA_BIO.txt TRN_RESULT_DATA_BIO_[0-9]{14}\.(GZ|gz) TRN_RESULT_DATA_BIO.txt
TRN_Recive_Inventry_[0-9]{14}\.(ZIP|zip) TRN_Recive_Inventry.txt TRN_Recive_Inventry_[0-9]{14}\.(GZ|gz) TRN_Recive_Inventry.txt
INST_IM_PLN_[0-9]{14}\.(ZIP|zip) INST_IM_PLN.txt INST_IM_PLN_[0-9]{14}\.(GZ|gz) INST_IM_PLN.txt
MR_YR_PLN_INST_KY_[0-9]{14}\.(ZIP|zip) MR_YR_PLN_INST_KY.txt MR_YR_PLN_INST_KY_[0-9]{14}\.(GZ|gz) MR_YR_PLN_INST_KY.txt
MST_WHLSLR_[0-9]{14}\.(ZIP|zip) MST_WHLSLR.txt MST_WHLSLR_[0-9]{14}\.(GZ|gz) MST_WHLSLR.txt
MST_SALES_PLACE_[0-9]{14}\.(ZIP|zip) MST_SALES_PLACE.txt MST_SALES_PLACE_[0-9]{14}\.(GZ|gz) MST_SALES_PLACE.txt
WHLSLR_LVL4_[0-9]{14}\.(ZIP|zip) WHLSLR_LVL4.txt WHLSLR_LVL4_[0-9]{14}\.(GZ|gz) WHLSLR_LVL4.txt
WHLSLR_LVL3_[0-9]{14}\.(ZIP|zip) WHLSLR_LVL3.txt WHLSLR_LVL3_[0-9]{14}\.(GZ|gz) WHLSLR_LVL3.txt
WHLSLR_LVL2_[0-9]{14}\.(ZIP|zip) WHLSLR_LVL2.txt WHLSLR_LVL2_[0-9]{14}\.(GZ|gz) WHLSLR_LVL2.txt
WHLSLR_LVL1_[0-9]{14}\.(ZIP|zip) WHLSLR_LVL1.txt WHLSLR_LVL1_[0-9]{14}\.(GZ|gz) WHLSLR_LVL1.txt
MST_COMPANY_[0-9]{14}\.(ZIP|zip) MST_COMPANY.txt MST_COMPANY_[0-9]{14}\.(GZ|gz) MST_COMPANY.txt
MST_COMPANY_GRP_[0-9]{14}\.(ZIP|zip) MST_COMPANY_GRP.txt MST_COMPANY_GRP_[0-9]{14}\.(GZ|gz) MST_COMPANY_GRP.txt
MST_DEAL_DIV_[0-9]{14}\.(ZIP|zip) MST_DEAL_DIV.txt MST_DEAL_DIV_[0-9]{14}\.(GZ|gz) MST_DEAL_DIV.txt
MST_PROD_PKG_[0-9]{14}\.(ZIP|zip) MST_PROD_PKG.txt MST_PROD_PKG_[0-9]{14}\.(GZ|gz) MST_PROD_PKG.txt
PROD_PRICE_[0-9]{14}\.(ZIP|zip) PROD_PRICE.txt PROD_PRICE_[0-9]{14}\.(GZ|gz) PROD_PRICE.txt
IM_PLN_PROD_[0-9]{14}\.(ZIP|zip) IM_PLN_PROD.txt IM_PLN_PROD_[0-9]{14}\.(GZ|gz) IM_PLN_PROD.txt
MST_ASSN_PROD_GRP_[0-9]{14}\.(ZIP|zip) MST_ASSN_PROD_GRP.txt MST_ASSN_PROD_GRP_[0-9]{14}\.(GZ|gz) MST_ASSN_PROD_GRP.txt
PROD_ASSN_TEAM_[0-9]{14}\.(ZIP|zip) PROD_ASSN_TEAM.txt PROD_ASSN_TEAM_[0-9]{14}\.(GZ|gz) PROD_ASSN_TEAM.txt
MST_ATC_PHARM_PROD_GRP_[0-9]{14}\.(ZIP|zip) MST_ATC_PHARM_PROD_GRP.txt MST_ATC_PHARM_PROD_GRP_[0-9]{14}\.(GZ|gz) MST_ATC_PHARM_PROD_GRP.txt
CUSTOMER_LOTNO_ALL_[0-9]{14}\.(ZIP|zip) CUSTOMER_LOTNO_ALL.txt CUSTOMER_LOTNO_ALL_[0-9]{14}\.(GZ|gz) CUSTOMER_LOTNO_ALL.txt
MST_INST_[0-9]{14}\.(ZIP|zip) MST_INST_MERCK.txt MST_INST_[0-9]{14}\.(GZ|gz) MST_INST_MERCK.txt
ATC_PHARM_[0-9]{14}\.(ZIP|zip) ATC_PHARM.txt ATC_PHARM_[0-9]{14}\.(GZ|gz) ATC_PHARM.txt
MST_WAREHOUSE_[0-9]{14}\.(ZIP|zip) MST_WAREHOUSE.txt MST_WAREHOUSE_[0-9]{14}\.(GZ|gz) MST_WAREHOUSE.txt
EMP_[0-9]{14}\.(ZIP|zip) EMP.txt EMP_[0-9]{14}\.(GZ|gz) EMP.txt
ORG_LVL4_[0-9]{14}\.(ZIP|zip) ORG_LVL4.txt ORG_LVL4_[0-9]{14}\.(GZ|gz) ORG_LVL4.txt
ORG_LVL3_[0-9]{14}\.(ZIP|zip) ORG_LVL3.txt ORG_LVL3_[0-9]{14}\.(GZ|gz) ORG_LVL3.txt
ORG_LVL2_[0-9]{14}\.(ZIP|zip) ORG_LVL2.txt ORG_LVL2_[0-9]{14}\.(GZ|gz) ORG_LVL2.txt
ORG_LVL1_[0-9]{14}\.(ZIP|zip) ORG_LVL1.txt ORG_LVL1_[0-9]{14}\.(GZ|gz) ORG_LVL1.txt
MST_JIS_PREF_[0-9]{14}\.(ZIP|zip) MST_JIS_PREF.txt MST_JIS_PREF_[0-9]{14}\.(GZ|gz) MST_JIS_PREF.txt
MST_JIS_CITY_[0-9]{14}\.(ZIP|zip) MST_JIS_CITY.txt MST_JIS_CITY_[0-9]{14}\.(GZ|gz) MST_JIS_CITY.txt
MST_INST_ASSN_[0-9]{14}\.(ZIP|zip) MST_INST_ASSN.txt MST_INST_ASSN_[0-9]{14}\.(GZ|gz) MST_INST_ASSN.txt
MST_GENERAL_[0-9]{14}\.(ZIP|zip) MST_GENERAL.txt MST_GENERAL_[0-9]{14}\.(GZ|gz) MST_GENERAL.txt