批量从SQL文件特定行后FROM子句提取表名的技术方案咨询
当然有可行的解决方案!针对你近7000个.sql.txt文件批量提取特定行号后FROM子句表名的需求,用Python写个脚本就能高效搞定——下面是我整理的实现方案,完美适配你给出的SQL示例场景:
核心思路
先遍历所有目标文件,跳转到指定行号之后的内容,用正则精准匹配FROM关键字后的表名(包括一行内多个空格分隔的表),最后把结果汇总输出,还能自动去重。
可运行脚本
import os import re def extract_table_names(file_path, start_line): unique_tables = set() # 正则匹配FROM后紧跟的表名,兼容大小写、多空格分隔的多个表 from_pattern = re.compile(r'\bFROM\s+([a-zA-Z0-9_ ]+)(?=\s|,|\)|$)', re.IGNORECASE) with open(file_path, 'r', encoding='utf-8', errors='ignore') as f: # 跳过前start_line-1行(默认行号是日常计数的1-based) for _ in range(start_line - 1): next(f) # 处理剩余行的内容 for line in f: matches = from_pattern.findall(line) for match in matches: # 拆分并清理匹配到的表名,过滤空字符串 tables = [t.strip() for t in match.split() if t.strip()] unique_tables.update(tables) return list(unique_tables) def batch_process(root_dir, target_line): summary = {} # 遍历目录下所有.sql.txt文件 for dirpath, _, filenames in os.walk(root_dir): for file in filenames: if file.endswith('.sql.txt'): full_path = os.path.join(dirpath, file) tables = extract_table_names(full_path, target_line) summary[file] = tables print(f"✅ {file} 处理完成,提取到表名:{', '.join(tables)}") # 把所有结果写入汇总文件 with open('extracted_tables_summary.txt', 'w', encoding='utf-8') as f: for filename, tables in summary.items(): f.write(f"{filename}: {', '.join(tables)}\n") print("\n🎉 所有文件处理完毕!汇总结果已保存到 extracted_tables_summary.txt") if __name__ == '__main__': # 配置你的参数:替换成SQL文件所在的文件夹路径 SQL_FILES_DIR = "./your_sql_files_folder" # 替换成你需要开始提取的行号(比如从第10行之后开始就写10) START_FROM_LINE = 5 batch_process(SQL_FILES_DIR, START_FROM_LINE)
关键说明
- 正则适配:脚本里的正则能完美匹配示例中
FROM后多个空格分隔的表(比如WT_work table、WT_Work_table1这类),还忽略大小写,兼容from/FROM的写法;如果你的表名包含特殊字符(比如引号、点号),可以调整正则表达式的字符范围。 - 去重处理:用集合存储表名,自动避免同一个文件里重复出现的表名。
- 行号处理:脚本默认行号是1-based(就是你日常数的第1行、第2行),如果你的需求是编程里的0-based索引,把
range(start_line - 1)改成range(start_line)即可。 - 编码兼容:打开文件时用了
errors='ignore',能处理一些编码不规范的文件,如果你明确知道文件编码,可以替换encoding='utf-8'为对应的编码(比如gbk)。
额外优化建议
- 如果只需要提取**最外层
FROM**的表名(不需要子查询里的),可以修改正则或者增加逻辑判断,比如跳过包含SELECT的嵌套行。 - 要是文件数量太大怕卡顿,可以加个进度条(比如用
tqdm库),让处理过程更直观。
内容的提问来源于stack exchange,提问作者Sshitanshu
相关产品推荐
相关产品推荐

