Python3如何将SQL列中<SOH>分隔的FIX数据拆分到CSV独立列
解决方案
核心修改逻辑
- 给csv.writer指定分隔符为
;,符合Excel读取分号分隔CSV的规则 - 对查询到的每条FIX数据,先按
(ASCII 0x01,Python中转义写为 \x01)拆分字段 - 可选对每个拆分后的字段取
=后的内容,去掉标签前缀 - 兼容处理行尾可能存在的注释内容
完整实现代码
基础版(保留标签前缀,符合基础期望输出)
import pyodbc import csv cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER=server;DATABASE=abc;UID=user;PWD=password') # 补充原代码缺失的cursor初始化 cursor = cnxn.cursor() sql = """select FIXData from table WHERE MessageTimestamp BETWEEN '2021-09-20 07:00:00' AND '2021-09-20 07:01:00';""" rows = cursor.execute(sql) with open(r'HOME/sqlresults.csv', 'w', newline='', encoding='utf-8') as csvfile: # 指定分号作为分隔符 writer = csv.writer(csvfile, delimiter=';') for row in rows: fix_data = row[0] # 先去掉行尾可能的注释内容,再按SOH拆分字段 valid_fix_part = fix_data.split('----')[0].strip() field_list = valid_fix_part.split('\x01') writer.writerow(field_list)
增强版(去掉标签前缀,符合额外需求)
import pyodbc import csv cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER=server;DATABASE=abc;UID=user;PWD=password') cursor = cnxn.cursor() sql = """select FIXData from table WHERE MessageTimestamp BETWEEN '2021-09-20 07:00:00' AND '2021-09-20 07:01:00';""" rows = cursor.execute(sql) with open(r'HOME/sqlresults.csv', 'w', newline='', encoding='utf-8') as csvfile: writer = csv.writer(csvfile, delimiter=';') for row in rows: fix_data = row[0] valid_fix_part = fix_data.split('----')[0].strip() field_list = valid_fix_part.split('\x01') # 去掉每个字段的数字=前缀,过滤异常无效字段 pure_value_list = [field.split('=', 1)[1] for field in field_list if '=' in field] writer.writerow(pure_value_list)
相关说明
- 补充了原代码缺失的cursor初始化步骤,避免触发未定义变量报错
- 自动过滤行尾的注释内容,不影响有效数据拆分
- 全程仅使用Python标准库和你已在使用的pyodbc数据库连接库,无额外第三方依赖
内容的提问来源于stack exchange,提问作者test1 1
相关产品推荐
相关产品推荐

