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

如何用PowerShell的ConvertFrom-Markdown解析Markdown表格的行列数据?

如何用ConvertFrom-Markdown提取Markdown表格的行和列数据

使用PowerShell的ConvertFrom-Markdown cmdlet解析带表格的Markdown时,默认返回的Tokens是扁平结构,直接查看Parent字段只能看到TableCell,要提取完整的表格行和列数据,得递归遍历AST找到表格节点,再逐层解析表头和行内容。

完整实现代码

# 定义递归查找表格节点的函数
function Find-TableTokens {
    param(
        [Parameter(Mandatory)]
        $Tokens
    )
    foreach ($token in $Tokens) {
        # 定位Table类型的节点
        if ($token.GetType().Name -eq 'Table') {
            return $token
        }
        # 有子节点则递归查找
        if ($token.Children) {
            $found = Find-TableTokens -Tokens $token.Children
            if ($found) { return $found }
        }
    }
}

# 测试用Markdown内容
$markdown = @'
# header1
## header2
| Column1 | Column2 |
| ------- | ------- |
| Row1Column1 | Row1Column2 |
| Row2Column1 | Ro2Column2 |
'@

# 解析Markdown并定位表格节点
$parsed = $markdown | ConvertFrom-Markdown
$table = Find-TableTokens -Tokens $parsed.Tokens

if (-not $table) {
    Write-Host "未找到表格节点"
    exit
}

# 提取表头文本
$headers = $table.Children | Where-Object { $_.GetType().Name -eq 'TableHeader' } | ForEach-Object {
    $_.Children | Where-Object { $_.GetType().Name -eq 'TableRow' } | ForEach-Object {
        $_.Children | Where-Object { $_.GetType().Name -eq 'TableCell' } | ForEach-Object {
            $_.Children | Where-Object { $_.GetType().Name -eq 'Paragraph' } | ForEach-Object {
                $_.Children | Where-Object { $_.GetType().Name -eq 'LiteralInline' } | Select-Object -ExpandProperty Content
            }
        }
    }
}

# 提取表格行数据并生成结构化对象
$rows = $table.Children | Where-Object { $_.GetType().Name -eq 'TableBody' } | ForEach-Object {
    $_.Children | Where-Object { $_.GetType().Name -eq 'TableRow' } | ForEach-Object {
        $rowCells = $_.Children | Where-Object { $_.GetType().Name -eq 'TableCell' } | ForEach-Object {
            $_.Children | Where-Object { $_.GetType().Name -eq 'Paragraph' } | ForEach-Object {
                $_.Children | Where-Object { $_.GetType().Name -eq 'LiteralInline' } | Select-Object -ExpandProperty Content
            }
        }
        # 将行数据与表头对应,生成自定义对象
        $rowObj = [PSCustomObject]@{}
        for ($i=0; $i -lt $headers.Count; $i++) {
            $rowObj | Add-Member -MemberType NoteProperty -Name $headers[$i] -Value $rowCells[$i]
        }
        $rowObj
    }
}

# 输出结果
Write-Host "表头:"
$headers -join ', '
Write-Host "`n表格行数据:"
$rows

关键逻辑说明

  1. 递归定位表格根节点:因为ConvertFrom-Markdown返回的Tokens是扁平结构,所以必须递归遍历所有节点,找到Table类型的根节点作为解析入口。
  2. 逐层提取文本内容:表格的结构是Table→TableHeader/TableBody→TableRow→TableCell→Paragraph→LiteralInline,最终从LiteralInline的Content属性中提取纯文本。
  3. 生成结构化对象:将提取的行数据与表头对应,生成PowerShell自定义对象,方便后续的筛选、导出等操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 12:25:17