求基于短划线父子关系规则合并多行数据的实现代码
基于短划线层级的父子数据合并实现
根据你给出的规则,这里提供Python和VBA两种实现方案,用来从原始数据生成合并后的层级路径。
规则回顾
- 顶级节点:无前置短划线,作为新的根节点
- 一级子节点:前置1个短划线,拼接为「顶级节点 - 子节点」
- 二级子节点:前置2个短划线,拼接为「顶级节点 - 一级子节点 -- 二级子节点」
- 同一层级的新节点会替换当前层级的父路径关联,确保子节点关联最近的父节点
Python 实现
def merge_hierarchy_data(raw_data): merged = [] # 存储各层级的完整合并文本,索引对应层级(0=顶级,1=一级子,2=二级子) levels = [] for item in raw_data: stripped = item.strip() if not stripped: merged.append("") continue # 统计前置短划线数量并提取节点文本 dash_count = 0 while stripped.startswith("-"): dash_count += 1 stripped = stripped[1:].lstrip() node_text = stripped if dash_count == 0: # 顶级节点,重置层级记录 levels = [node_text] merged.append(node_text) else: # 确保层级数组长度足够 if dash_count >= len(levels): levels.append("") # 基于上一层级的文本拼接当前层级路径 parent_text = levels[dash_count - 1] current_text = f"{parent_text} {'-'*dash_count} {node_text}" levels[dash_count] = current_text merged.append(current_text) return merged # 测试示例数据 raw_data = [ "鱼", "- 三文鱼", "-- 鳟鱼", "牛奶", "- 奶粉", "- 酸奶", "- 奶酪", "-- 粉状奶酪" ] # 输出测试结果 print("| 序号 | 原始数据 | 合并后数据 |") print("| ---- | -------- | ---------- |") for idx, (raw, merged) in enumerate(zip(raw_data, merge_hierarchy_data(raw_data)), 1): print(f"| {idx} | {raw} | {merged} |")
代码说明
levels数组用来维护每个层级的完整路径,索引对应层级深度- 遍历原始数据时,先统计前置短划线数量确定层级,提取纯节点文本
- 顶级节点直接重置
levels,子节点基于上一层级的路径拼接当前节点,更新对应层级的路径记录 - 测试代码会输出和你示例完全一致的结果
VBA 实现(适用于Excel)
如果你需要在Excel中直接处理数据,可以使用以下自定义函数:
Function MergeHierarchy(rawRange As Range) As Variant Dim result() As String ReDim result(1 To rawRange.Rows.Count) As String Dim levels() As String ReDim levels(0 To 0) As String Dim i As Integer Dim rawText As String Dim dashCount As Integer Dim nodeText As String For i = 1 To rawRange.Rows.Count rawText = Trim(rawRange.Cells(i, 1).Value) If rawText = "" Then result(i) = "" GoTo NextRow End If ' 统计前置短划线数量 dashCount = 0 Do While Left(rawText, 1) = "-" dashCount = dashCount + 1 rawText = LTrim(Mid(rawText, 2)) Loop nodeText = rawText If dashCount = 0 Then ' 顶级节点,重置层级数组 ReDim levels(0 To 0) As String levels(0) = nodeText result(i) = nodeText Else ' 扩展层级数组(如果需要) If dashCount > UBound(levels) Then ReDim Preserve levels(0 To dashCount) As String End If ' 拼接当前层级路径 levels(dashCount) = levels(dashCount - 1) & " " & String(dashCount, "-") & " " & nodeText result(i) = levels(dashCount) End If NextRow: Next i MergeHierarchy = Application.Transpose(result) End Function
使用方法
- 打开Excel,按
Alt+F11打开VBA编辑器 - 插入新模块,粘贴上述代码
- 在工作表中输入公式
=MergeHierarchy(A2:A9)(假设原始数据在A2到A9),按回车即可得到合并后的数据
内容的提问来源于stack exchange,提问作者tombombadil
相关产品推荐
相关产品推荐

