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

使用Python将老旧Fortran程序复杂输出转换为CSV

老旧Fortran天气数据转CSV格式问题

需将Fortran程序生成的2024夏季天气汇总复杂表格数据转为简洁CSV格式,但现有Regex和Pandas实现仅输出表头,无法提取有效数据。


原代码问题分析

尝试代码1(Regex+CSV)的问题

  1. 语法错误:文件路径字符串未闭合(input_file = 'table_example.txt、output_file = 'weather_summary.csv),直接导致代码运行报错。
  2. 正则匹配过严:正则要求每行严格以|开头且包含17个捕获组,但Fortran生成的表格存在分隔行(如全-/=行)、表头行,结构与数据行不一致,导致匹配失败。
  3. 表头定义错误:表头字符串被换行拆分(如"Most \nin Day (Date)"),会造成CSV表头错乱。

尝试代码2(Pandas)的问题

  1. 分隔符解析问题:用sep="|"会将每行首尾的|解析为空列,导致列数不匹配,表头赋值对应关系错误。
  2. 跳过行逻辑不准确:固定skiprows=8未考虑文件实际结构,可能跳过有效数据或保留无效行。
  3. 未清理冗余字符:原始数据单元格含大量空格,解析后残留无效字符。

解决方案

方案1:Pandas优化版

通过灵活的行过滤、列清理逻辑精准提取数据:

import pandas as pd

# 读取文件,处理分隔符和无效行
df = pd.read_csv(
    'table_example.txt',
    sep=r'\|',  # 用正则匹配|,避免转义问题
    header=None,
    # 示例逻辑:跳过前8行表头/说明,跳过奇数行的分隔线(需根据实际文件调整)
    skiprows=lambda x: x < 8 or x % 2 == 1,
    skip_blank_lines=True,
    engine='python'
)

# 删除空列(首尾|生成的无效列)
df = df.dropna(axis=1, how='all')

# 清理所有单元格的多余空格
df = df.applymap(lambda x: x.strip() if isinstance(x, str) else x)

# 设置标准表头
df.columns = [
    "Station", "Rainfall Total", "Most in Day (Amount)", "Most in Day (Date)",
    "Max Air Temp", "Min Air Temp", "Mean Air Temp", "Max Temp", "Max Temp Date",
    "Min Temp", "Min Temp Date", "Sunshine Total", "Most in Day Sunshine (Amount)",
    "Most in Day Sunshine (Date)", "Max Wind Gust", "Max Wind Gust Date",
    "Grass Min Temp", "Grass Min Temp Date"
]

# 保存为CSV
df.to_csv('weather_summary.csv', index=False)

方案2:Regex优化版

修复正则匹配逻辑,过滤无效行:

import re
import csv

input_file = 'table_example.txt'
output_file = 'weather_summary.csv'

def parse_weather_data(file_path):
    data = []
    # 匹配包含17个字段的有效数据行
    pattern = re.compile(r'^\|(.+?)\|(.+?)\|(.+?)\|(.+?)\|(.+?)\|(.+?)\|(.+?)\|(.+?)\|(.+?)\|(.+?)\|(.+?)\|(.+?)\|(.+?)\|(.+?)\|(.+?)\|(.+?)\|(.+?)\|.*$')
    
    with open(file_path, 'r') as file:
        for line in file:
            line = line.strip()
            # 跳过空行、分隔行(如---/===开头的行)
            if not line or line.startswith(('---', '===')):
                continue
            match = pattern.match(line)
            if match:
                row = [group.strip() for group in match.groups()]
                # 确保字段数与表头一致
                if len(row) == 17:
                    data.append(row)
    return data

def write_to_csv(data, output_file):
    headers = [
        "Station", "Rainfall Total", "Most in Day (Amount)", "Most in Day (Date)",
        "Max Air Temp", "Min Air Temp", "Mean Air Temp", "Max Temp", "Max Temp Date",
        "Min Temp", "Min Temp Date", "Sunshine Total", "Most in Day Sunshine (Amount)",
        "Most in Day Sunshine (Date)", "Max Wind Gust", "Max Wind Gust Date",
        "Grass Min Temp", "Grass Min Temp Date"
    ]
    with open(output_file, mode='w', newline='') as file:
        writer = csv.writer(file)
        writer.writerow(headers)
        writer.writerows(data)

weather_data = parse_weather_data(input_file)
write_to_csv(weather_data, output_file)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 21:20:01