【问题标题】:How do I separate SQL column values which are separated by <SOH> to be separate columns in Python3?如何将由 <SOH> 分隔的 SQL 列值分隔为 Python3 中的单独列?
【发布时间】:2021-11-17 06:04:38
【问题描述】:

CSV 文件:

没有标题

8=Fix1.1<SOH>9=70<SOH>35=AE<SOH>10=237 ----This entire message is FIXData value
8=Fix1.1<SOH>9=71<SOH>35=AE<SOH>10=238
8=Fix1.1<SOH>9=72<SOH>35=AE<SOH>10=239
8=Fix1.1<SOH>9=73<SOH>35=AE<SOH>10=240

我如何通过查询 MS DB 将数据导入 CSV 文件的代码片段。

cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER=server;DATABASE=abc;UID=user;PWD=password')

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='') as csvfile:

    writer = csv.writer(csvfile)

#    writer.writerow([x[0] for x in cursor.description]) --- dont want headers

    for row in rows:

        writer.writerow(row)

问题:

  • 从 CSV 文件可以看出,整个 FIX 消息被压缩到 1 个单元格中(此处考虑 Excel)。
  • FIX 消息由 分隔,基本上我想将标签分隔到单独的单元格中。

所需的输出:

  • CSV 文件格式(最好用 ';' 分隔),这样当我在 excel 中打开 csv 时,标签值将在自己的单元格中,而不是压缩在一个单元格中。
8=Fix1.1;9=70;35=AE;10=237
8=Fix1.1;9=71;35=AE;10=238
8=Fix1.1;9=72;35=AE;10=239
8=Fix1.1;9=73;35=AE;10=240 

奖金期望输出:

  • 这是可选的,但如果可以在上述范围内完成会有所帮助。
  • 删除标签的第一部分

CSV 文件

Fix1.1;70;AE;237
Fix1.1;71;AE;238
Fix1.1;72;AE;239
Fix1.1;73;AE;240

注意:

  • 请注意,我不能使用第三方模块(不能使用 Pandas 数据框等)

【问题讨论】:

  • 我会敦促您修复您的数据结构。你违反了 1NF,这就是为什么这是一个挑战。如果这不可行,那么我建议在您的查询中执行此操作。使用不错的拆分功能相当容易。在较新的版本中有一个内置的拆分器,但它有些限制,因为它们未能在输出中提供边缘犯罪的等级。
  • 同意 1NF 这意味着他们不能将消息转储到单独的行/列中。不幸的是,鉴于 Networks 团队将消息转储到数据库中,我对此没什么好争辩的。请您详细说明拆分功能吗?我获得了一个只读帐户,因此无法修改表格等。

标签: sql-server python-3.x xml csv


【解决方案1】:

最后,我想我将只使用 Python 替换方法将 SOH 字符转换为 ,,这给了我上述所需的输出。

我设法使用线程 How to search and replace text in a file? 获得了解决方案

# Read in the file
with open('file.txt', 'r') as file :
  filedata = file.read()

# Replace the target string
filedata = filedata.replace('x01', ',') ---- Using RHEL based system so found '\u001' didnt work for me. Dont know the details of why....

# Write the file out again
with open('file.txt', 'w') as file:
  file.write(filedata)

【讨论】:

    猜你喜欢
    • 2018-11-01
    • 2014-02-05
    • 1970-01-01
    • 2021-04-27
    • 2019-12-10
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 2022-12-10
    相关资源
    最近更新 更多