我几天前才开始学习 Powershell,所以这对我来说是全新的。问题是我需要尽快完成这件事。 所以我有 2 个需要集成的文件 - .csv 和 .xml。我的想法是转换其中一个,这样我首先会有两个相同格式的文件。我了解到 .csv 文件更易于使用,因此决定将 .xml 文件转换为 .csv。 然而,我尝试过的一切都失败了。但我也找不到与我的类似的 .xml 文件的示例。我的文件如下所示(有些 id 为空):
<Objects>
<Object>
<Property Name="id"/>
<Property Name="username">JLOCK0</Property>
<Property Name="phoneType">phone1</Property>
<Property Name="value">346-209-9609</Property>
</Object>
<Object>
<Property Name="id">vjWJem2qcU+cxPT2qIvqsw==</Property>
<Property Name="username">CSELWYN1</Property>
<Property Name="phoneType">phone1</Property>
<Property Name="value">562-981-5379</Property>
</Object>
</Objects>
我尝试过的所有代码要么只显示 id、用户名、phoneType 和值而不显示值,要么只显示值。向上或向下移动节点没有帮助。我得到的最接近的是:
[xml]$xml_file = Get-Content ".\phone.xml"
$xml_file.ChildNodes.ChildNodes | ForEach-Object { $_.ChildNodes[1], $_.ChildNodes[0], $_.ChildNodes[2],
$_.ChildNodes[3]}| ConvertTo-Csv | Out-File ".\phone.csv"
但是使用这段代码我只得到 2 个 header :Name 和 #text。用户名、id、电话类型、值显示在第一列中,它们的值显示在第二列中。 下面的代码仅添加标题:
[xml]$data = Get-Content ".\phone.xml"
$result = New-Object psobject -Property $props
$result | Add-Member NoteProperty "id" $data.SelectSingleNode("//Property").id
$result | Add-Member NoteProperty "username" $data.SelectSingleNode("//Property").username
$result | Add-Member NoteProperty "phoneType" $data.SelectSingleNode("//Property").phoneType
$result | Add-Member NoteProperty "value" $data.SelectSingleNode("//Property").value
$result | Export-Csv ".\newphone.csv" -Force -Delimiter ';' -Encoding utf8
最佳答案
可能有更好的方法,但目前这应该可以帮助您构建 object[]
,之后可以将其转换为 CSV:
$result = foreach($i in $xml.Objects.Object)
{
$out = [ordered]@{}
foreach($prop in $i.Property)
{
$out[$prop.Name] = $prop.'#text'
}
[pscustomobject]$out
}
$结果
:
id username phoneType value
-- -------- --------- -----
JLOCK0 phone1 346-209-9609
vjWJem2qcU+cxPT2qIvqsw== CSELWYN1 phone1 562-981-5379
关于xml - 在 Powershell 中将 xml 转换为 csv 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70442725/