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
相关产品推荐
相关产品推荐

