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

Python统计活动行数并更新BIDGROUP行第七列值的问题

需求与问题概述
  • 输入为16列数据,需完成两个核心操作:
    1. 统计最终输出的总行数
    2. 找到包含"BIDGROUP"的行,将其第7列(索引6)设置为输出总行数 - 1(例如输出6行时,该列值为5)
  • 现有代码已实现将"ADVANCED_TRIP"行拆分为多条"TRIP_ID"行,但统计并更新BIDGROUP行的逻辑不符合预期

输入示例

"131594", "", "BIDGROUP", 1, 0, 0, 2, "", 0:00, 0:00, 01JAN2009, 01JAN2009, 01JAN2009, 01JAN2009, false, 0,
"131594", "AWARD", "UNTOUCHABLE", 1, 1, 0, 1, "", 0:00, 0:00, 10JUN2014, 13JUN2014 23:59, 01JAN2009, 01JAN2009, false, 100,
"131594", "AWARD", "ADVANCED_TRIP", 1, 2, 0, 0, "740025Jun2014,705406Jun2014,737722Jun2014,696130Jun2014", 0:00, 0:00, 01JAN2009, 01JAN2009, 01JAN2009, 01JAN2009, false, 15,

预期输出示例

"131594", "", "BIDGROUP", 1, 0, 0, 5, "", 0:00, 0:00, 01JAN2009, 01JAN2009, 01JAN2009, 01JAN2009, false, 0,
"131594", "AWARD", "UNTOUCHABLE", 1, 1, 0, 1, "", 0:00, 0:00, 10JUN2014, 13JUN2014 23:59, 01JAN2009, 01JAN2009, false, 100,
"131594", "AWARD", "TRIP_ID", 1, 2, 0, 0, "7400", 0:00, 0:00, 25Jun2014, 01JAN2009, 01JAN2009, 01JAN2009, false, 15,
"131594", "AWARD", "TRIP_ID", 1, 3, 0, 0, "7054", 0:00, 0:00, 06Jun2014, 01JAN2009, 01JAN2009, 01JAN2009, false, 15,
"131594", "AWARD", "TRIP_ID", 1, 4, 0, 0, "7377", 0:00, 0:00, 22Jun2014, 01JAN2009, 01JAN2009, 01JAN2009, false, 15,
"131594", "AWARD", "TRIP_ID", 1, 5, 0, 0, "6961", 0:00, 0:00, 30Jun2014, 01JAN2009, 01JAN2009, 01JAN2009, false, 15,

现有代码(无统计功能)

import sys
import re


lines = []

for line in sys.stdin:
    lines.append(line.strip())

output_lines = []

for line in lines:
    elements = line.split(", ")
    if elements[2] == '"ADVANCED_TRIP"':
        elements[2] = '"TRIP_ID"'
        trip_ids = elements[7].split(",")
        dates = re.findall(r'\d{2}[A-Za-z]{3}\d{4}', line)
        for i, (trip_id, date) in enumerate(zip(trip_ids, dates)):
            trip_id = trip_id.strip('"')
            output_line = elements[:7] + [f'"{trip_id[:4]}"'] + elements[8:]
            output_line[4] = str(int(output_line[4]) + i)
            output_line[10] = date
            output_lines.append(output_line)
    else:
        output_lines.append(elements)

for output_line in output_lines:
    print(", ".join(output_line))

尝试统计的代码(逻辑未达预期)

import sys
import re

lines = []

for line in sys.stdin:
    lines.append(line.strip())

output_lines = []
total_activity_count = 0
trip_id_activity_count = 0

for line in lines:
    elements = line.split(", ")
    if elements[2] == '"BIDGROUP"':
        total_activity_count += 1
        elements[6] = str(total_activity_count)
        output_lines.append(elements)
    elif elements[2] == '"ADVANCED_TRIP"':
        elements[2] = '"TRIP_ID"'
        trip_ids = elements[7].split(",")
        dates = re.findall(r'\d{2}[A-Za-z]{3}\d{4}', line)
        for i, (trip_id, date) in enumerate(zip(trip_ids, dates)):
            trip_id = trip_id.strip('"')
            output_line = elements[:7] + [f'"{trip_id[:4]}"'] + elements[8:]
            output_line[4] = str(int(output_line[4]) + i)
            output_line[10] = date
            output_lines.append(output_line)
            trip_id_activity_count += 1
    else:
        output_lines.append(elements)
        total_activity_count += 1

for output_line in output_lines:
    print(", ".join(output_line))

解决方案

问题核心在于:原尝试代码在生成输出行时就修改BIDGROUP行,但此时还无法得知最终总行数。需先完整生成所有输出行,再统计总行数并更新BIDGROUP行。

修改后的代码如下:

import sys
import re

# 读取输入行
lines = [line.strip() for line in sys.stdin]
output_lines = []

# 第一步:先完整生成所有输出行(暂不处理BIDGROUP的第7列)
for line in lines:
    elements = line.split(", ")
    if elements[2] == '"ADVANCED_TRIP"':
        elements[2] = '"TRIP_ID"'
        trip_ids = elements[7].split(",")
        dates = re.findall(r'\d{2}[A-Za-z]{3}\d{4}', line)
        for i, (trip_id, date) in enumerate(zip(trip_ids, dates)):
            trip_id = trip_id.strip('"')
            output_line = elements[:7] + [f'"{trip_id[:4]}"'] + elements[8:]
            output_line[4] = str(int(output_line[4]) + i)
            output_line[10] = date
            output_lines.append(output_line)
    else:
        output_lines.append(elements)

# 第二步:计算总行数,找到BIDGROUP行并更新第7列(索引6)
total_rows = len(output_lines)
target_value = total_rows - 1

for idx, line_elements in enumerate(output_lines):
    if line_elements[2] == '"BIDGROUP"':
        # 保留原有的引号格式
        line_elements[6] = f'"{target_value}"'
        break  # 假设仅存在一个BIDGROUP行,找到后终止遍历

# 第三步:输出最终结果
for line_elements in output_lines:
    print(", ".join(line_elements))

关键修改点说明

  • 分阶段执行:先完成所有输出行的生成(含ADVANCED_TRIP拆分),确保能准确获取最终总行数
  • 延迟更新BIDGROUP行:拿到总行数后,再遍历输出行找到"BIDGROUP"行,将其第7列设置为总行数-1,同时保留原有的引号格式
  • 简化计数逻辑:直接通过len(output_lines)获取总行数,无需维护额外计数变量,避免人工计数错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 08:47:32