You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

批量从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)

关键说明

  1. 正则适配:脚本里的正则能完美匹配示例中FROM后多个空格分隔的表(比如WT_work table、WT_Work_table1这类),还忽略大小写,兼容from/FROM的写法;如果你的表名包含特殊字符(比如引号、点号),可以调整正则表达式的字符范围。
  2. 去重处理:用集合存储表名,自动避免同一个文件里重复出现的表名。
  3. 行号处理:脚本默认行号是1-based(就是你日常数的第1行、第2行),如果你的需求是编程里的0-based索引,把range(start_line - 1)改成range(start_line)即可。
  4. 编码兼容:打开文件时用了errors='ignore',能处理一些编码不规范的文件,如果你明确知道文件编码,可以替换encoding='utf-8'为对应的编码(比如gbk)。

额外优化建议

  • 如果只需要提取**最外层FROM**的表名(不需要子查询里的),可以修改正则或者增加逻辑判断,比如跳过包含SELECT的嵌套行。
  • 要是文件数量太大怕卡顿,可以加个进度条(比如用tqdm库),让处理过程更直观。

内容的提问来源于stack exchange,提问作者Sshitanshu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:21:19