PowerShell中XML转CSV:如何将水平格式转为垂直格式?
将XML转CSV的PowerShell脚本改为垂直格式输出
你当前的脚本生成的是水平布局CSV(字段作为列,单条记录占一行),要改成垂直布局(每个字段名和对应值各占一行),可以直接修改脚本,省去中间导出再导入CSV的冗余步骤,直接处理XML节点生成目标格式:
修改后的脚本
$xmlPath = "C:\temp\test.xml" $outputFolder = Split-Path -Parent $xmlPath # 加载XML文件 [xml]$xml = Get-Content $xmlPath # 遍历每个Employee节点 foreach ($employee in $xml.SelectNodes("//EmployeeImport/Employee")) { # 生成输出文件名:姓名+格式化后的入职日期(替换斜杠为下划线) $cleanHireDate = $employee.HireDate -replace '/','_' $fileName = "$($employee.FirstName) $($employee.LastName)_$cleanHireDate.csv" $outputPath = Join-Path -Path $outputFolder -ChildPath $fileName # 收集字段名和对应值,过滤掉PSObject自带的系统属性 $verticalEntries = @() foreach ($prop in $employee.PSObject.Properties) { # 只保留实际业务字段,跳过XML节点的系统属性 if ($prop.Name -notmatch 'NodeType|ParentNode|OwnerDocument|InnerXml|OuterXml') { $verticalEntries += [PSCustomObject]@{ FieldName = $prop.Name FieldValue = $prop.Value } } } # 生成符合你期望格式的CSV内容(每行是字段名和对应值) $csvContent = $verticalEntries | ForEach-Object { "$($_.FieldName),$($_.FieldValue)" } $csvContent | Out-File -Path $outputPath -Encoding UTF8 }
关键改动说明
省去中间CSV环节:直接从XML节点提取数据,不用先导出再重新导入,提升运行效率
过滤无效属性:排除XML节点自带的系统属性(比如
NodeType、InnerXml),只保留业务字段生成垂直格式内容:把每个字段的“名-值”对转换成CSV的一行,最终输出的CSV内容为:
Name,Mickey Social,123456对应表格展示就是你期望的垂直布局:
Name Mickey Social 123456 保留原命名逻辑:输出文件的命名规则和你原来的脚本一致,确保文件名符合需求
可选:标准垂直CSV格式(更规范)
如果你需要更符合CSV规范的格式(固定表头,每行是属性和值),可以把生成内容的部分改成:
# 生成带固定表头的标准垂直CSV $verticalEntries | Export-Csv -Path $outputPath -NoTypeInformation -Encoding UTF8 -Delimiter ','
对应的CSV内容为:
"FieldName","FieldValue" "Name","Mickey" "Social","123456"
表格展示为:
| FieldName | FieldValue |
|---|---|
| Name | Mickey |
| Social | 123456 |
内容的提问来源于stack exchange,提问作者FishNowWorkLater
相关产品推荐
相关产品推荐

