如何用PowerShell将指定行转置为列?含DATCOM数据处理需求
处理DATCOM导出数据的PowerShell自动化方案
1. 按多空格拆分文本(规避Import-CSV解析错误)
直接读取文件内容,用正则匹配任意连续空格拆分字段,彻底解决多空格分隔导致的解析问题:
# 读取过滤后的文件,跳过空行 $rawLines = Get-Content -Path "your_filtered_file.csv" | Where-Object { $_ -match '\S' } # 按连续空格拆分每行,自动过滤拆分产生的空元素 $splitLines = $rawLines | ForEach-Object { $_ -split '\s+' | Where-Object { $_ } }
2. 动态行转置为列(支持4/5列可变)
假设需将连续N行(N为4或5)转置为一行的N列,可通过判断组大小完成转置(可根据实际数据特征调整组大小的判断逻辑):
# 定义支持的列数(组大小) $allowedGroupSizes = @(4,5) $finalData = @() $currentGroup = @() foreach ($line in $splitLines) { $currentGroup += $line # 检查当前组是否达到指定大小 if ($allowedGroupSizes -contains $currentGroup.Count) { # 将组内每行转为一列,生成自定义对象 $row = [PSCustomObject]@{} for ($i=0; $i -lt $currentGroup.Count; $i++) { $row | Add-Member -MemberType NoteProperty -Name "Col_$($i+1)" -Value $currentGroup[$i] } $finalData += $row $currentGroup = @() } } # 处理剩余未完成的有效组 if ($currentGroup.Count -gt 0 -and $allowedGroupSizes -contains $currentGroup.Count) { $row = [PSCustomObject]@{} for ($i=0; $i -lt $currentGroup.Count; $i++) { $row | Add-Member -MemberType NoteProperty -Name "Col_$($i+1)" -Value $currentGroup[$i] } $finalData += $row } # 导出最终结果 $finalData | Export-Csv -Path "final_result.csv" -NoTypeInformation -Encoding UTF8
3. 批处理一键调用
创建批处理文件(如run_process.bat),内容如下,实现双击自动化执行:
@echo off powershell -ExecutionPolicy Bypass -File "datcom_process.ps1" echo 处理完成,按任意键退出... pause >nul
将上述PowerShell代码保存为datcom_process.ps1,与批处理文件放在同一目录,修改脚本中的文件路径为实际路径即可。
内容的提问来源于stack exchange,提问作者Nawaf_Ar
相关产品推荐
相关产品推荐

