import pandas as pd
import openpyxl
from datetime import datetime

path = r"F:\gj.txt"

# 定义按照邮件处理函数
def process_file_by_mailNumber(file_path):
    data = []
    current_mailNumber = None
    current_data = {}
    opTimeStart = ''
    with open(file_path, 'r', encoding='utf-8') as file:
        for line in file:
            linesplit = line.split('|')
            mailNumber = linesplit[0]

            if mailNumber == current_mailNumber:
                try:
                    if linesplit[3] == "203":
                        sjopTimeStart = linesplit[1]
                        current_data['机构号'] = linesplit[2]
                        current_data['机构名'] = linesplit[5]
                    if (linesplit[2] == "21000") & (linesplit[3] == "352"):
                        clopTimeStart = linesplit[1]
                        current_data['处理中心解车时间'] = clopTimeStart
                    if (linesplit[2] == "21000") & (linesplit[3] == "389"):
                        clopTimeEnd = linesplit[1]
                        current_data['处理中心封车时间'] = clopTimeEnd
                        start_datetime = datetime.strptime(clopTimeStart, '%Y-%m-%d %H:%M:%S')
                        end_datetime = datetime.strptime(clopTimeEnd, '%Y-%m-%d %H:%M:%S')
                        hour_difference = (end_datetime - start_datetime).total_seconds() / 3600
                        current_data['处理时长'] = hour_difference

                    if (linesplit[2][:3] == "215") & (linesplit[3] == "306"):
                        tdopTimeStart = linesplit[1]
                        current_data['到达时间'] = tdopTimeStart
                    if (linesplit[2][:3] == "215") and (linesplit[3] == "706" or linesplit[3] == "711"):
                        tdopTimeEnd = linesplit[1]
                        current_data['妥投时间'] = tdopTimeStart
                        start_datetime = datetime.strptime(tdopTimeStart, '%Y-%m-%d %H:%M:%S')
                        end_datetime = datetime.strptime(tdopTimeEnd, '%Y-%m-%d %H:%M:%S')
                        hour_difference = (end_datetime - start_datetime).total_seconds() / 3600
                        current_data['投递时长'] = hour_difference
                        start_datetime = datetime.strptime(sjopTimeStart, '%Y-%m-%d %H:%M:%S')
                        day_difference = (end_datetime - start_datetime).total_seconds() / 3600 * 24
                        current_data['在途时长'] = day_difference
                    if (linesplit[2] == "21506000") & (linesplit[3] == "999"):
                        split_str = linesplit[16].split("</br>")

                        current_data['类别'] = split_str[0].split(":")[1]
                        current_data['环节'] = split_str[3].strip("[]")
                        current_data['验单号'] = split_str[1].split(":")[1]
                except Exception as e:
                    # 处理其他异常的代码块
                    print("发生了异常:", mailNumber + str(e))
                    continue
            else:
                if current_data:
                    data.append(current_data)
                current_mailNumber = mailNumber
                current_data = {}
                current_data['邮件编号'] = mailNumber
                clopTimeStart = ''
                clopTimeEnd = ''
                sjopTimeStart = ''
                opOrgCode = ''
                opOrgSimpleName = ''
                tdopTimeEnd = ''
                tdopTimeStart = ''
    
    return data

data = process_file_by_mailNumber(path)
df = pd.DataFrame(data)
df.to_excel("output.xlsx", index=False)

本代码首先定义了一个 process_file_by_mailNumber 函数,它读取文件内容,并根据邮件编号将数据分组。然后,它提取每个邮件编号下的相关信息,例如机构号、机构名、处理时长、投递时长等,并将其存储在字典中。最后,它将所有字典添加到一个列表中,并使用 Pandas 将列表转换为 DataFrame,并将其保存为 Excel 文件。

代码特点:

  • 使用 Pandas 库,简化了数据处理和写入 Excel 文件的操作。
  • 按照邮件编号将数据分组,提取每个邮件编号下的关键信息。
  • 处理了可能出现的异常,并打印了异常信息。
  • 代码清晰易懂,便于理解和维护。

使用方法:

  1. 确保已安装 Pandas 和 openpyxl 库。
  2. path 变量设置为文本文件的路径。
  3. 运行代码,代码会生成一个名为 output.xlsx 的 Excel 文件,其中包含处理后的邮件数据。

示例:

假设文本文件 gj.txt 的内容如下:

1234567890|2023-03-01 10:00:00|203|2023-03-01 10:00:00|21000|352|2023-03-01 10:00:00|21506000|999|2023-03-01 10:00:00|2023-03-01 10:00:00|2023-03-01 10:00:00|2023-03-01 10:00:00|2023-03-01 10:00:00|2023-03-01 10:00:00|2023-03-01 10:00:00|2023-03-01 10:00:00|2023-03-01 10:00:00|类别:快递|环节:[寄件,收件,运输,签收]|验单号:1234567890
1234567890|2023-03-01 10:00:00|21000|389|2023-03-01 10:00:00|2023-03-01 10:00:00|2023-03-01 10:00:00|2023-03-01 10:00:00|2023-03-01 10:00:00|2023-03-01 10:00:00|2023-03-01 10:00:00|2023-03-01 10:00:00|2023-03-01 10:00:00|2023-03-01 10:00:00|2023-03-01 10:00:00|2023-03-01 10:00:00|2023-03-01 10:00:00|2023-03-01 10:00:00

运行代码后,生成的 output.xlsx 文件的内容如下:

| 邮件编号 | 机构号 | 机构名 | 处理中心解车时间 | 处理中心封车时间 | 处理时长 | 到达时间 | 妥投时间 | 投递时长 | 在途时长 | 类别 | 环节 | 验单号 | |---|---|---|---|---|---|---|---|---|---|---|---|---| | 1234567890 | 21000 | | 2023-03-01 10:00:00 | 2023-03-01 10:00:00 | 0.0 | | | | | 快递 | [寄件,收件,运输,签收] | 1234567890 |

注意:

  • 本代码仅供参考,实际应用中可能需要根据具体需求进行修改。
  • 确保文本文件 gj.txt 的格式与代码中解析的格式一致。
  • 代码中使用的日期格式为 %Y-%m-%d %H:%M:%S,如需修改请修改代码中的日期格式字符串。
  • 代码中未处理可能出现的空值,如需处理空值请根据具体情况添加代码。
  • 代码中未对数据进行验证,如需验证数据请根据具体情况添加代码。

原文地址: https://www.cveoy.top/t/topic/mi7J 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录