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

逐行读取文本统计FBC值,达标时停止并保存指定行数据

解决FBC统计与目标数据提取问题

我看你现在的问题是要处理存储闪存测试数据的文本文件,需要统计每个Block下的FBC条目,直到遇到FBC值≥500的条目时停止,并且保存该FBC条目上方的那行数据里的特定字段对吧?之前的代码逻辑有点绕,而且拆分了两次文件读取,导致数据跟踪出错,咱们来一步步修正这个问题。

问题分析

你的核心目标是:

  • 按Block分组处理数据
  • 每个Block内统计FBC条目数量,直到FBC≥500时停止统计
  • 保存该FBC条目上方行里的十六进制数据段(比如DFFFBFFF,FFBBFFFF,FCFFFF8F,FDFBFFCC这类)

之前的代码主要问题在于:

  1. 分两次读取文件,没法关联Block、FBC计数和目标数据的对应关系
  2. 没有正确存储每个Block对应的FBC计数和目标数据,导致输出混乱
  3. 逻辑判断里的found标记没有很好地控制每个Block内的处理流程

解决方案代码

这里我写了一份整合逻辑的代码,一次性读取文件,按Block分组处理,同时跟踪计数和目标数据:

import re

# 存储最终结果:每个Block对应的(统计数, 目标数据)
result = []
current_block_data = {
    'count': 0,
    'target_data': None,
    'found': False  # 标记当前Block是否已找到FBC≥500的条目
}

# 编译FBC匹配正则,提高效率
fbc_pattern = re.compile(r'FBC\s*=\s*(\d+)')

with open('Test.txt', 'r') as f:
    for line in f:
        line = line.strip()
        if not line:
            continue
        
        # 遇到新的Block,重置当前Block的统计状态
        if line.startswith('Block'):
            # 如果上一个Block有有效数据,加入结果列表
            if current_block_data['found']:
                result.append(
                    (current_block_data['count'], current_block_data['target_data'])
                )
            # 重置状态
            current_block_data = {
                'count': 0,
                'target_data': None,
                'found': False
            }
            continue
        
        # 如果当前Block已经找到符合条件的FBC,跳过后续行
        if current_block_data['found']:
            continue
        
        # 处理包含FBC的行
        if 'FBC =' in line:
            current_block_data['count'] += 1
            # 提取FBC数值
            match = fbc_pattern.search(line)
            if match:
                fbc_value = int(match.group(1))
                # 当FBC≥500时,标记当前Block处理完成(已保存上方行数据)
                if fbc_value >= 500:
                    current_block_data['found'] = True
        else:
            # 非FBC行,提取我们需要保存的十六进制数据段
            if 'Cycle= 1' in line:
                # 拆分行,取Cycle=1之后、Page之前的部分
                parts = line.split('Cycle= 1,')
                if len(parts) > 1:
                    hex_part = parts[1].split(', Page =')[0].strip()
                    current_block_data['target_data'] = hex_part

# 处理最后一个Block的数据
if current_block_data['found']:
    result.append(
        (current_block_data['count'], current_block_data['target_data'])
    )

# 输出结果
for idx, (count, data) in enumerate(result, 1):
    print(f"第{idx}部分统计数为{count},保存{data}")

代码逻辑说明

  1. 状态跟踪:用current_block_data字典跟踪当前Block的统计数、目标数据和是否已找到符合条件的FBC,确保每个Block独立处理,互不干扰。
  2. 正则匹配:预编译FBC的正则表达式,比每次临时匹配更高效,能准确提取FBC数值。
  3. 数据提取:遇到包含Cycle=1的行时,精准提取其中的十六进制数据段——这就是你要保存的FBC条目上方的对应行数据。
  4. Block切换处理:每次遇到新的Block时,将上一个Block的有效结果存入列表,然后重置状态,开始处理新Block的数据。

预期输出

运行这段代码后,你会得到完全符合需求的输出:

第1部分统计数为3,保存DFFFBFFF,FFBBFFFF,FCFFFF8F,FDFBFFCC
第2部分统计数为4,保存DFFFFFFC,FFBBFFFB,FFEFFF8F,FDFBFDDD

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:32:10