如何将LibreOffice/Excel中选手赛事数据转为指定格式字符串?
解决方案
一、Excel兼容方案
1. 适用于Excel 365/2021(支持动态数组)
如果你的Excel版本支持动态数组,直接用以下公式(假设选手列是A列,赛事列是B列,从第2行开始数据,D2生成结果):
=A2&"("&TEXTJOIN(", ", TRUE, SORT(FILTER($B$2:$B$100, $A$2:$A$100=A2)))&")"
- 说明:
FILTER筛选当前选手的所有赛事,SORT对赛事排序,TEXTJOIN用逗号分隔拼接,最后和选手名组合成目标格式。下拉填充公式即可自动适配所有选手,新增选手或赛事无需手动调整。
2. 适用于旧版Excel(2019及以前)
旧版Excel无FILTER/SORT,可使用数组公式+TEXTJOIN(需按Ctrl+Shift+Enter确认输入):
=A2&"("&TEXTJOIN(", ", TRUE, IF($A$2:$A$100=A2, $B$2:$B$100, ""))&")"
- 排序处理:若需要赛事排序,先对表格按「选手列+赛事列」升序排序,再使用上述公式即可得到有序的赛事列表。
- 进阶:若频繁使用,可编写VBA自定义函数,复用性更强:
按Alt+F11打开VBA编辑器,插入模块,粘贴以下代码:
回到Excel,在单元格输入Function JoinEvents(player As String, dataRange As Range) As String Dim eventsArr() As String ReDim eventsArr(0 To dataRange.Rows.Count - 1) Dim i As Integer, count As Integer count = 0 ' 收集当前选手的所有赛事 For i = 1 To dataRange.Rows.Count If dataRange.Cells(i, 1).Value = player Then eventsArr(count) = dataRange.Cells(i, 2).Value count = count + 1 End If Next i ' 排序赛事 ReDim Preserve eventsArr(0 To count - 1) Dim temp As String, j As Integer For i = 0 To count - 2 For j = i + 1 To count - 1 If eventsArr(i) > eventsArr(j) Then temp = eventsArr(i) eventsArr(i) = eventsArr(j) eventsArr(j) = temp End If Next j Next i ' 拼接成目标格式 JoinEvents = player & "(" & Join(eventsArr, ", ") & ")" End Function=JoinEvents(A2, $A$2:$B$100)即可生成结果,新增数据只需调整数据范围参数。
二、Python脚本方案
用Pandas处理更高效,自动适配新增数据,默认赛事排序:
import pandas as pd # 读取Excel数据(替换为你的文件路径和工作表名) df = pd.read_excel("你的数据文件.xlsx", sheet_name="Sheet1") # 按选手分组,合并并排序赛事 grouped = df.groupby("选手")["赛事"].agg(lambda x: ", ".join(sorted(x))).reset_index() # 生成目标格式字符串 grouped["结果"] = grouped.apply(lambda row: f"{row['选手']}({row['赛事']})", axis=1) # 保存结果到新Excel文件 grouped.to_excel("整理结果.xlsx", index=False) # 打印结果 print("生成的结果:") for item in grouped["结果"].tolist(): print(item)
- 说明:无需手动调整规则,新增选手或赛事后重新运行脚本即可,赛事自动按字母/拼音排序(可修改
sorted的参数调整排序逻辑)。
内容的提问来源于stack exchange,提问作者JSJ
相关产品推荐
相关产品推荐

