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 os
import sys
import zipfile
from datetime import datetime
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 error import error
# 定数
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')
@ -222,7 +182,7 @@ def is_empty_file(work_csv_row: list, settings_list: list):
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:
work_data_file (bytes): S3から読み込んだ登録
@ -236,50 +196,21 @@ def uncompress_file(work_data_file: bytes, settings_list: list, log_info) -> byt
print(
f'{datetime.now():%Y-%m-%d %H:%M:%S} {log_info} {INFO} I-CHK-11 - 投入ファイルが圧縮されているため、展開処理を行います。圧縮形式:{compression}')
file_bytes: bytes = None
if compression == 'zip':
file_bytes = None
with zipfile.ZipFile(work_data_file, 'r') as zip_ref:
# 昇順でソートする。
file_list: list[str] = sorted(zip_ref.namelist())
# zipファイルを展開し、ファイルを書き出す。
file_bytes = uncompress_zip(work_data_file, settings_list, log_info)
elif compression == 'gzip':
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以外の圧縮形式に対応する際に追記すること
else:
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):
"""バイトモードのファイルストリームを後ろから読み、1行ずつ返すジェネレータ。
@ -331,12 +262,12 @@ def reverse_readline_stream(f: io.BytesIO, line_feed: str, chunk_size=4096):
# ローカル実行用コード
# 値はよしなに変えてください
# if __name__ == '__main__':
# check(
# bucket_name='バケット名',
# target_data_source='データソース名',
# target_file_name='targetフォルダ内のファイル名',
# settings_key='個別設定ファイル名',
# log_info='Info',
# mode='i'
# )
if __name__ == '__main__':
check(
bucket_name='test-shimoda-bucket',
target_data_source='test',
target_file_name='compress_test.gz',
settings_key='test/settings/compress_test_gzip.txt',
log_info='Info',
mode='i'
)

View File

@ -1,16 +1,81 @@
import csv
import gzip
import io
import zipfile
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 = {
'n': 'normal',
'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):
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):
"""csvモジュールの囲い文字を変換する
@ -26,3 +91,105 @@ def convert_quotechar(quotechar):
return None
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 pymysql
from chk import LOCAL_TEMPORARY_FILE_PATH
from common import convert_quotechar, debug_log
from common import (ERROR, INFO, LINE_FEED_CODE, LOCAL_TEMPORARY_FILE_PATH,
MYSQL_CHARSET_CODE, SETTINGS_ITEM, WARNING,
convert_quotechar, debug_log)
from error import error
from pymysql.constants import CLIENT
# 定数
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/'
TRUNCATE_SRC_TABLE_SYMBOL = 'truncate_src_table:'
TRUNCATE_SRC_TABLE_IDENTIFY_SYMBOL_FORMAT = f'{TRUNCATE_SRC_TABLE_SYMBOL}[蓄積スキーマのテーブル名]'
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')

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -14,4 +14,4 @@ INST_IM_PLN_ex.sql
truncate_src_table:src07.inst_im_pln
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
1
1
zip
gzip

View File

@ -14,4 +14,4 @@ MST_ASSN_PROD_GRP_ex.sql
truncate_src_table:src07.mst_assn_prod_grp
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
1
1
zip
gzip

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -14,4 +14,4 @@ PROD_PRICE_ex.sql
truncate_src_table:src07.prod_price
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
1
1
zip
gzip

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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