如何用PowerShell结合正则实现带触发关键字的矩阵转置?
PowerShell 按关键字触发的矩阵转置(生成稀疏矩阵)
需求说明
输入为n×2格式的矩阵示例:
a 1 b 2 c 3 d 4 a 5 d 6 a 7 b 8 c 9要求:每次出现关键字
a时开启新的输出列,最终生成稀疏矩阵(缺失的位置留空)。
实现代码
# 读取输入数据(可替换为Get-Content读取文件,或通过管道输入) $inputData = @' a 1 b 2 c 3 d 4 a 5 d 6 a 7 b 8 c 9 '@ -split "`n" | ForEach-Object { $_.Trim() } | Where-Object { $_ } # 初始化变量:存储所有列、当前列、所有唯一键 $columns = @() $currentColumn = [ordered]@{} $keys = @() # 遍历每行数据,按关键字分割列 foreach ($line in $inputData) { $key, $value = $line -split '\s+', 2 # 记录所有出现过的键,用于构建完整行 if ($keys -notcontains $key) { $keys += $key } # 触发列切换:遇到关键字'a'时保存当前列,重置当前列 if ($key -eq 'a') { if ($currentColumn.Count -gt 0) { $columns += $currentColumn } $currentColumn = [ordered]@{} } # 将当前键值对加入当前列 $currentColumn[$key] = $value } # 处理最后一列数据 if ($currentColumn.Count -gt 0) { $columns += $currentColumn } # 生成并输出稀疏矩阵 foreach ($key in $keys) { $rowCells = foreach ($col in $columns) { $col.ContainsKey($key) ? $col[$key] : '' } Write-Host ($rowCells -join "`t") }
代码逻辑说明
- 数据预处理:将输入文本拆分为行,去除空行和首尾空格,确保每行都是有效的键值对。
- 列分组触发:通过匹配关键字
a实现列分割,每次遇到a就将当前已收集的键值对作为新列存入集合,同时重置当前列开始收集下一组数据。 - 稀疏矩阵构建:以所有出现过的键作为行标识,遍历每一列填充对应值,缺失的键对应位置留空,最终输出转置后的矩阵。
内容的提问来源于stack exchange,提问作者Nicholas Saunders
相关产品推荐
相关产品推荐

