You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求基于短划线父子关系规则合并多行数据的实现代码

基于短划线层级的父子数据合并实现

根据你给出的规则,这里提供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

使用方法

  1. 打开Excel,按Alt+F11打开VBA编辑器
  2. 插入新模块,粘贴上述代码
  3. 在工作表中输入公式=MergeHierarchy(A2:A9)(假设原始数据在A2到A9),按回车即可得到合并后的数据

内容的提问来源于stack exchange,提问作者tombombadil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 10:45:25