如何从分号分隔的文本文件中解析公司名称与营收数据并找出总营收最高的公司

如何从分号分隔的文本文件中解析公司名称与营收数据并找出总营收最高的公司

Python

本文详解如何读取含公司名与多期营收的文本文件,将每行按分号拆分为结构化数据,计算各公司总营收,并准确返回营收最高的公司名称及数值。

本文详解如何读取含公司名与多期营收的文本文件,将每行按分号拆分为结构化数据,计算各公司总营收,并准确返回营收最高的公司名称及数值。

在处理结构化文本数据(如以分号 ; 分隔的公司营收记录)时,关键在于正确解析每行、分离元数据(公司名)与数值数据(各期营收),并进行聚合计算。原始代码存在多个问题:误用制表符 \t 而非分号 ; 拆分、变量名拼写错误(lista_list)、未去除公司名前缀 *、未转换和累加营收数值,也未实现结果提取逻辑。

以下是经过优化、健壮且可直接运行的解决方案:

def company_with_max_revenue(filename):
    """
    从指定txt文件中读取公司营收数据,返回总营收最高的公司及其营收总额。

    文件格式要求:每行形如 "*Company X;rev1;rev2;rev3..."
    公司名以 '*' 开头,后续字段均为整数营收值。
    """
    data = []  # 存储 (总营收, 公司名) 元组

    with open(filename, 'r', encoding='utf-8') as f:
        for line in f:
            line = line.strip()
            if not line:  # 跳过空行
                continue

            parts = line.split(';')
            if len(parts) < 2:
                continue  # 忽略格式异常行(无营收数据)

            company_name = parts[0].lstrip('*')  # 去除开头的 '*'
            revenue_values = parts[1:]           # 后续所有字段为营收字符串

            try:
                total_revenue = sum(int(val) for val in revenue_values)
                data.append((total_revenue, company_name))
            except ValueError:
                # 若某营收值非数字,跳过该行并可选记录警告
                print(f"Warning: Skipping invalid revenue values in line: {line}")
                continue

    if not data:
        raise ValueError("No valid company data found in the file.")

    # 按总营收升序排序,取最后一项(即最大值)
    # 或更高效地使用 max():max(data, key=lambda x: x[0])
    best = max(data, key=lambda x: x[0])
    return best

# 使用示例
FILENAME = "companies.txt"  # 替换为你的实际文件路径

try:
    revenue, company = company_with_max_revenue(FILENAME)
    print(f"The biggest revenue: {company}")
    print(f"The revenue is: {revenue}")
except FileNotFoundError:
    print(f"Error: File '{FILENAME}' not found.")
except ValueError as e:
    print(f"Data error: {e}")

核心要点说明:

  • 正确拆分:使用 line.split(';') 获取所有字段,而非错误的 \t;
  • 解包技巧:company, *revenues = parts 是简洁写法,但显式索引(parts[0], parts[1:])更清晰、容错性更强;
  • 前缀处理:用 .lstrip('*') 安全移除可能存在的一个或多个 *,避免硬编码切片风险;
  • 类型转换与求和:int(val) 确保整数运算(题目中均为整数,无需 float);生成器表达式 sum(...) 高效且内存友好;
  • 异常防护:捕获 ValueError 处理非数字营收,跳过坏行并提示,避免程序中断;
  • 结果提取:使用 max(..., key=...) 直接获取最大值元组,比 sorted()[-1] 更高效(时间复杂度 O(n) vs O(n log n));
  • 健壮性增强:检查空行、字段数不足、文件不存在等边界情况。

运行此代码,输入示例数据后将精准输出:

The biggest revenue: Company 3  
The revenue is: 34000

该方案兼具可读性、健壮性与生产可用性,适用于真实业务场景中的简单营收分析任务。

本文地址:https://www.sztg.com.cn/article/676495.html

如非特殊说明,本站内容均来自于网友自主分享,如有任何问题均请联系我们进行处理!

猜您喜欢