NAS中CSV按首字母分存SQL表的代码故障排查
问题解决:CSV文件分类导入SQL表及表存在问题处理
需求概述
读取NAS存储上的CSV文件,逐行判断每行首字段值:
- 首字段为
H的行存入SQL表A - 首字段为
D的行存入SQL表B - 首字段为
T的行存入SQL表C
现有问题
当前代码存在两个核心问题:
- 仅读取第一行,无法遍历后续行
- 重复运行时提示表已存在,添加
DROP TABLE语句后仍无效
现有代码片段
Create all tables; then declare the path of the file; `df = open(path, 'r') Lines = df.readlines() count = 0 for line in Lines: count += 1 data = line.split('|') Create tables A, B and C if data[0] == "H": Then insert into table if data[0] == "D": Then insert into table if data[0] == "T": Then insert into table `
CSV示例数据
H|2.1|Additional Diag|2.1|Proprietary|ASMINB|2.1||751106|TXT||20210927190057|PROD|a7a8ec06-b1bc-4961-b1b5-61203c9d1ac2|ASM PD/HDC|89|Epsilon Team||ASM_HC_EXTERNAL|CHART QA|00253|||||^ D|MR|1437662063|||UHC|c943dcff416cd893e0534499330ae568|751106-10000003-01|8DG5CE9VM53_GSQA23221504|P|124|||||1164926390|176624||DEFAULT|99|PADGETT|NATALIE|||||||||||1164926390||||||||||||||104994605||AMC|AMR;AMR|8DG5CE9VM53|HARPER|DAVID|L|04/01/1960|M|H2531|1302 RAMBLEWOOD TRL||SOUTH EUCLID|OH|44121|||08/09/2021|08/09/2021|ICD10|||E1042|CO||||99213|12|20210927190057||N||8DG5CE9VM53|8DG5CE9VM53||||^ T|751106|1|1|3|^
问题分析与修复方案
问题1:仅读取第一行,无法遍历后续行
原代码的for line in Lines:循环没有缩进,导致循环体仅执行第一行后就跳出,后续行未被处理。此外,表创建语句被放在循环内部,会导致每次循环都尝试创建表,引发错误。
修复步骤:
- 给循环体的代码添加正确缩进,确保每行都能被遍历处理
- 将表创建语句移到循环外部,只执行一次
问题2:重复运行时表已存在,DROP TABLE无效
可能的原因:
DROP TABLE语句未正确执行(比如表名大小写不匹配、未指定数据库)- 原代码中表创建语句在循环内,即使加了DROP也会被重复执行
修复步骤:
- 使用
DROP TABLE IF EXISTS语句替代直接DROP TABLE,避免表不存在时报错 - 将表创建逻辑放在循环之前,确保只执行一次
修正后的代码示例(以Python+SQLite为例)
import sqlite3 # 可替换为MySQL、PostgreSQL等对应数据库驱动 # 数据库连接 conn = sqlite3.connect('your_database.db') cursor = conn.cursor() # 预创建表:存在则删除,再创建 # 表A(H开头行) cursor.execute('DROP TABLE IF EXISTS table_A') cursor.execute(''' CREATE TABLE table_A ( col1 TEXT, col2 TEXT, col3 TEXT, -- 根据CSV实际字段补充列定义 PRIMARY KEY (col1) ) ''') # 表B(D开头行) cursor.execute('DROP TABLE IF EXISTS table_B') cursor.execute(''' CREATE TABLE table_B ( col1 TEXT, col2 TEXT, col3 TEXT, -- 根据CSV实际字段补充列定义 PRIMARY KEY (col1) ) ''') # 表C(T开头行) cursor.execute('DROP TABLE IF EXISTS table_C') cursor.execute(''' CREATE TABLE table_C ( col1 TEXT, col2 TEXT, col3 TEXT, -- 根据CSV实际字段补充列定义 PRIMARY KEY (col1) ) ''') # 读取NAS上的CSV文件 path = '/path/to/your/nas/file.csv' with open(path, 'r') as df: lines = df.readlines() count = 0 for line in lines: count += 1 # 清理行尾的换行符和末尾的^符号 cleaned_line = line.strip().rstrip('^') data = cleaned_line.split('|') # 跳过空行 if not data[0]: continue if data[0] == 'H': # 插入表A,占位符数量需与列数匹配 cursor.execute('INSERT INTO table_A VALUES (?, ?, ?, ...)', data) elif data[0] == 'D': cursor.execute('INSERT INTO table_B VALUES (?, ?, ?, ...)', data) elif data[0] == 'T': cursor.execute('INSERT INTO table_C VALUES (?, ?, ?, ...)', data) # 提交事务并关闭连接 conn.commit() cursor.close() conn.close()
额外注意事项
- 数据库连接需根据实际使用的SQL数据库调整对应驱动和连接字符串
- CSV字段可能存在空值,需确保表结构允许空值,或在插入时做空值处理
- 大文件建议使用逐行读取(而非一次性
readlines()),避免内存占用过高
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

