如何用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
关键逻辑说明
- 递归定位表格根节点:因为
ConvertFrom-Markdown返回的Tokens是扁平结构,所以必须递归遍历所有节点,找到Table类型的根节点作为解析入口。 - 逐层提取文本内容:表格的结构是
Table→TableHeader/TableBody→TableRow→TableCell→Paragraph→LiteralInline,最终从LiteralInline的Content属性中提取纯文本。 - 生成结构化对象:将提取的行数据与表头对应,生成PowerShell自定义对象,方便后续的筛选、导出等操作。
内容的提问来源于stack exchange,提问作者garrmark
相关产品推荐
相关产品推荐

