一、需求
由於日常分析中,常常會將一些 SQL 腳本寫到一個文件中,而其中包括了多個建表語句,他們中部分是並列關系,因此將他們分割為多個文件就有一定的必要性。
包含有以下特性
- 以英文半角分號
;
為分割符號,將一個SQL文件分割為多個 - 只有單獨一行的
;
才會作為分割文件的標識符,因為常常在建表語句前面有刪表語句drop if exist ...;
- 分割出的文件名必須被指定
二、代碼
def split_sql(sql_file, to_dir, file_names):
"""將一個SQL文件分割成幾個SQL文件,以單獨一行 `;` 作為標識
Args:
sql_file (str): 要分割的SQL文件路徑
to_dir (str): 要寫入到的文件夾路徑
file_names (列表): 要生成的SQL文件列表
"""
with open(sql_file, 'r', encoding='utf8') as sf:
sf_list = sf.read().split('\n;')
sf_list=[x for x in sf_list if x]
assert len(sf_list) == len(file_names),'文件、名稱數量不相等'
n_files = len(sf_list)
for i in range(n_files):
with open("./"+to_dir+"/"+file_names[i], mode='w', encoding='utf8') as f1:
f1.write(sf_list[i].strip()+'\n;\n')
print("完成文件:"+file_names[i])
主要過程就是將文件讀取,再利用 \n;
作為分隔符號對文件進行分割,再將這些文件寫入到指定文件名的文件中。
三、測試
新建文件: testsql.sql
drop table if exists temp.tablename;
create table temp.tablename STORED AS PARQUET as
file1
;
drop table if exists temp.tablename;
create table temp.tablename STORED AS PARQUET as
file2
;
drop table if exists temp.tablename;
create table temp.tablename STORED AS PARQUET as
file3
;
drop table if exists temp.tablename;
create table temp.tablename STORED AS PARQUET as
file4
;
運行以下腳本進行測試:
if __name__ == '__main__':
sql_file = './testsql.sql'
file_names = ['test1.sql', 'test2.sql', 'test3.sql', 'test4.sql']
to_dir = './dir_sql'
os.mkdir(to_dir)
split_sql(sql_file, to_dir,file_names)
函數包含三個參數是:要分割的文件、分割后的文件放到哪個文件夾中(此處是to_dir),和文件名列表。運行后就可以查看到分割后的文件了。
dir_sql/
├── test1.sql
├── test2.sql
├── test3.sql
└── test4.sql