基于服务名合并多服务器多CSV文件至单个CSV的方案咨询
合并多服务器多服务CSV文件(按服务分组)实现方案
核心思路
我来给你梳理一下实现这个需求的具体思路,用Python的pandas库就能轻松搞定——核心是先把同服务类型的CSV文件归为一组,再分别合并每组内的数据,最后输出成符合要求的单个文件(单工作表CSV或多工作表Excel)。下面是分步操作指南和代码实现:
步骤1:解析文件名,提取关键信息
每个文件名的格式是sum_[服务器名]check_[服务名].csv,我们可以用正则表达式快速拆分出:
- 服务器名:比如
devas1.devad.myworldpanel.com - 服务名:比如
check_cpu、interface_eth0
步骤2:按服务分组存储数据
用一个字典来管理不同服务的数据,键是服务名,值是该服务对应的所有数据表格。这样能确保同服务的文件被放在一起,后续合并更方便。
步骤3:输出目标文件
根据需求选择输出格式:
- 单工作表CSV:按服务顺序,先写对应服务的表头,再写入该服务下所有服务器的数据
- 多工作表Excel(更推荐):每个服务对应一个独立工作表,自动保留各自的表头,不同服务的数据互不干扰,可读性更强
具体代码实现(Python + Pandas)
import pandas as pd import os import re # 1. 定义正则表达式匹配文件名格式 file_pattern = re.compile(r'sum_(.*)check_(.*)\.csv') # 2. 初始化字典,用来按服务名存储对应的数据表 service_data = {} # 3. 遍历当前目录下的所有CSV文件 for filename in os.listdir('.'): if filename.endswith('.csv'): match_result = file_pattern.match(filename) if match_result: server_name = match_result.group(1) service_name = match_result.group(2) # 读取当前CSV文件(注意示例是空格分隔,实际如果是逗号就改成sep=',') df = pd.read_csv(filename, sep=' ') # 将数据表加入对应服务的列表中 if service_name not in service_data: service_data[service_name] = [] service_data[service_name].append(df) # 4. 输出为单工作表CSV(按服务分组展示) with open('merged_all_services.csv', 'w') as output_file: for service_name, df_list in service_data.items(): # 合并同服务的所有数据 merged_df = pd.concat(df_list, ignore_index=True) # 写入表头和数据 merged_df.to_csv(output_file, sep=' ', index=False, header=True) # 可选:加入分隔线区分不同服务块 output_file.write('\n--- {} 数据结束 ---\n\n'.format(service_name)) # 5. 或者输出为多工作表Excel(更适合不同表头的场景) with pd.ExcelWriter('merged_all_services.xlsx') as writer: for service_name, df_list in service_data.items(): merged_df = pd.concat(df_list, ignore_index=True) merged_df.to_excel(writer, sheet_name=service_name, index=False)
注意事项
- 分隔符适配:示例中的CSV用空格分隔,如果你实际文件是逗号或其他分隔符,修改代码里的
sep参数即可 - 表头一致性:假设同服务的所有CSV文件表头完全一致,如果存在表头差异,可以给
pd.concat加上join='outer'参数,保留所有列 - 文件路径:如果CSV文件不在当前工作目录,把
os.listdir('.')改成你的文件所在路径即可
内容的提问来源于stack exchange,提问作者Empty Coder
相关产品推荐
相关产品推荐

