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

数据处理:将小数点逗号转点并修正异常行(Python场景)

修复CSV数据中逗号混用为分隔符与小数点的问题

问题背景

原始CSV数据存在格式错误:逗号同时被用作列分隔符和小数点符号,实际每行应包含6列,但直接按逗号拆分时会得到12个元素(正常行),部分行还出现行粘连、标点混用的情况(比如点和逗号错误替换),导致拆分后列数异常,无法正常处理。

原始数据示例

5,960464,6,65430376927058E-10,-91,7689743041992,-89,5235061645508,6,71407200919707E-05,0,00869479635485696
11,92093,5,23110578457515E-10,-92,8140640258789,-90,5685958862305,8,97218165598724E-05,0,011619072933792

目标格式

x,y1,y2,y3,y4,y5
5.960464,6.65430376927058E-10,-91.7689743041992,-89.5235061645508,6.71407200919707E-05,0.00869479635485696
11.92093,5.23110578457515E-10,-92.8140640258789,-90.5685958862305,8.97218165598724E-05,0.011619072933792

错误行示例

16433.7,08114511022965E-12.-111,498962402344.-109,253494262695.0,000461181910941812.016438.96,5.80785796046257E-12,-112.359840393066,-110.114372253418,0.000461223557779535,0.0597289529135575

正常行示例

17476.08,6.52454250181715E-12,-111.854499816895,-109.609031677246,0.00046727035202924,0.0605120193526557
17482.04,3.88578861020505E-12,-114.105209350586,-111.859741210938,0.000467303551829094,0.0605163187628847

解决方案

以下Python代码可处理正常行与错误行,核心逻辑是先修复标点错误、拆分粘连行,再合并字段还原正确小数格式:

import re

def process_single_line(line):
    # 修复错误标点:将 .- 替换为 ,-(还原负数字段的分隔)
    line = re.sub(r'(\d)\.-', r'\1,-', line)
    # 拆分粘连的行:将数字后的 .(数字) 替换为 ,(数字)(比如 0123.4567 拆为 0123,4567)
    line = re.sub(r'(\d)\.(\d{2,})', r'\1,\2', line)
    # 按逗号拆分所有片段
    segments = [s.strip() for s in line.split(',') if s.strip()]
    
    # 每两个片段合并为一个字段(逗号转小数点)
    merged_fields = []
    for i in range(0, len(segments), 2):
        part_a = segments[i]
        part_b = segments[i+1] if i+1 < len(segments) else ''
        merged_fields.append(f"{part_a}.{part_b}" if part_b else part_a)
    
    return merged_fields

# 处理文件
input_path = "input_data.txt"
output_path = "fixed_data.txt"

with open(input_path, 'r', encoding='utf-8') as infile, open(output_path, 'w', encoding='utf-8') as outfile:
    # 写入表头
    outfile.write("x,y1,y2,y3,y4,y5\n")
    
    for raw_line in infile:
        raw_line = raw_line.strip()
        if not raw_line:
            continue
        
        processed_fields = process_single_line(raw_line)
        # 拆分粘连的完整行(若字段数超过6,说明是两行合并)
        while len(processed_fields) >= 6:
            outfile.write(','.join(processed_fields[:6]) + '\n')
            processed_fields = processed_fields[6:]

代码说明

  1. 标点修复:用正则表达式修正错误的点号,将导致字段粘连的标点还原为逗号分隔结构。
  2. 字段合并:将每两个逗号分隔的片段合并为一个字段,用小数点替换逗号,还原正确的小数格式。
  3. 粘连行拆分:若处理后字段数超过6,自动拆分为多行,确保每行都是完整的6列数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 03:27:03