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

Python新手求助:SAP表平面文件批量导入SQLite数据库问题

SAP TXT平面文件批量导入SQLite的load_table函数实现方案

核心问题分析

现有load_table函数逻辑混乱,未正确区分表头与数据行,也未生成合法的INSERT语句执行插入操作。以下是具体实现思路及修正代码:

实现步骤

  • 分离表头与数据行:读取TSV文件后,第一行(按\t分割后)作为SQL表的字段名,后续所有行作为待插入的数据
  • 构建参数化INSERT语句:使用SQLite的?占位符,避免SQL注入风险,同时适配字段数量动态生成语句
  • 批量插入优化性能:收集所有数据行后,用executemany一次性插入,比逐行执行效率更高
  • 处理数据格式:对数值型字段(如T156X的CNT02)做类型转换,空字符串转为None适配SQLite空值规则

修正后的load_table函数

def load_table(table, chemin):
    # 存储表头和数据
    headers = []
    data_rows = []
    
    with open(chemin, 'r', encoding='utf-16') as f:
        for line_num, line in enumerate(f):
            # 去除首尾空白并按制表符分割
            dr = line.strip().split("\t")
            # 跳过空行(分割后长度<=1的行)
            if len(dr) <= 1:
                continue
            
            if line_num == 0:
                # 第一行作为表头
                headers = dr
            else:
                # 后续行处理数据:空字符串转为None,数值字段转类型
                processed_row = []
                for idx, val in enumerate(dr):
                    val = val.strip()
                    # 根据表结构判断是否需要转整数(以T156X、T156W的CNT02字段为例)
                    if table in ['T156X', 'T156W'] and headers[idx] == 'CNT02':
                        processed_row.append(int(val) if val else None)
                    else:
                        processed_row.append(val if val else None)
                data_rows.append(processed_row)
    
    # 生成INSERT语句并执行批量插入
    if headers and data_rows:
        placeholders = ', '.join(['?'] * len(headers))
        columns = ', '.join(headers)
        sql = f"INSERT INTO {table.upper()} ({columns}) VALUES ({placeholders})"
        
        c.executemany(sql, data_rows)
        conn.commit()
        print(f"成功导入{len(data_rows)}条数据到表{table.upper()}")

额外注意事项

  • 确保SAP导出的TXT文件表头字段名与SQLite表的字段名完全一致,否则会导致插入失败
  • 若其他表存在数值型字段,需在数据处理环节添加对应的类型转换逻辑
  • 若文件实际编码不是utf-16,需调整open函数的encoding参数匹配编码格式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 06:23:13