Bootstrap

sql 查询语句:将终端数据形式转换成insert语句

文本转换:sql 查询语句:将终端数据形式转换成insert语句

在这里插入图片描述
在这里插入图片描述
如上,写过后端的都知道,从生产或其他地方拿到的数据,有可能会是图一;但实际上,我们需要图二的数据;

不废话,直接上代码:

import os

"""
@author: qiuYeBai
@time: 2024/11/24
license: (C) Copyright 2024, qiuYeBai
功能:
查询语句:将终端数据形式转换成insert语句
"""


def process_line(line):
    """
    处理单行数据:去掉两端 '| ' 和 ' |',按 ' | ' 分割,去掉单元格多余空格。
    如果单元格是空字符串,则处理为 '';
    如果是 NULL 或 null,则处理为 NULL(不加单引号)。
    其他值加上单引号。
    :param line: 原始行数据
    :return: 处理后的行数据列表
    """
    line = line.strip().strip('|')  # 去掉前后 '|' 和多余空格等
    cells = [
        "NULL" if cell.strip().lower() == "null" else
        "''" if not cell.strip() else
        f"'{cell.strip()}'"
        for cell in line.split(' | ')
    ]
    return cells


def process_line_columns(line):
    line = line.strip().strip('|')  # 去掉前后 '|' 和多余空格等
    cells = [f"{cell.strip()}" for cell in line.split(' | ')]
    return cells


# 辅助函数:获取列名行
def get_columns_line_index(lines):
    for i, line in enumerate(lines):
        if '|' in line and not line.strip().startswith('+'):
            return i
    raise ValueError("未找到列名行")


# 辅助函数:获取最后一行行号
def get_last_line_index(lines):
    for i in range(len(lines) - 1, -1, -1):  # 从文件末尾向前查找
        if '|' in lines[i] and not lines[i].strip().startswith('+'):
            return i
    raise ValueError("未找到数据结束行")


def convert_mysql_output_to_insert(file_path):
    """
    将 MySQL 查询结果转换为 INSERT INTO 语句并保存为 .sql 文件
    :param file_path: 输入文件路径
    """
    table_name = os.path.splitext(os.path.basename(file_path))[0]  # 用文件名作为表名
    output_file = f"{table_name}.sql"  # 输出文件名

    with open(file_path, 'r', encoding='utf-8') as file:
        lines = file.readlines()

    columns_line_index = get_columns_line_index(lines)
    last_line_index = get_last_line_index(lines)

    # 排除第一行、第三行和最后一行,提取列名和数据行
    # 实际上还有考虑空行等
    columns_line = lines[columns_line_index].strip()  # 第二行是列名
    data_lines = lines[columns_line_index + 2:last_line_index]  # 数据行是从第4行到倒数第2行

    # 提取列名
    columns = process_line_columns(columns_line)

    # 处理每行数据
    insert_statements = []
    for line in data_lines:
        values = process_line(line)
        insert_statement = f"INSERT INTO {table_name} ({', '.join(columns)}) VALUES ({', '.join(values)});"
        insert_statements.append(insert_statement)

    # 保存到输出文件
    with open(output_file, 'w', encoding='utf-8') as output:
        output.write('\n'.join(insert_statements))

    print(f"SQL 文件已生成: {output_file}")


# 示例调用
# a.txt
if __name__ == '__main__':
    convert_mysql_output_to_insert("a.txt")

天气冷了,夜深了;
加油,晚安,🍀
保持热爱

;