基于子集信息的 Powershell xml 到 CSV select 节点
Powershell xml to CSV select node based on Subset's info
我正在尝试将 XML 文件转换为 CSV。为此,我需要检查某些集合(“laborid”和“kundenid”)以及子集的值
(“tourid”和“tourzeit”)基于“befundtour”等于true:
的子集
<customer>
<laborid>XXXXX</laborid>
<kundenid>AAAAA</kundenid>
<ziellabor>BBB</ziellabor>
<tourpos>
<tourid>073316</tourid>
<tourzeit>10:50:00</tourzeit>
<MO>true</MO>
<DI>true</DI>
<MI>true</MI>
<DO>true</DO>
<FR>true</FR>
<SA>false</SA>
<SO>false</SO>
<gpsLaenge>9151569</gpsLaenge>
<gpsBreite>48432079</gpsBreite>
<befundtour>true</befundtour>
<abholtour>true</abholtour>
<druck>true</druck>
<versandtour>true</versandtour>
<status>A</status>
</tourpos>
<tourpos>
<tourid>773802</tourid>
<tourzeit>00:50:00</tourzeit>
<bemerkung><![CDATA[Briefkasten ist offen (Klappe)!]]></bemerkung>
<MO>false</MO>
<DI>false</DI>
<MI>false</MI>
<DO>false</DO>
<FR>false</FR>
<SA>false</SA>
<SO>false</SO>
<gpsLaenge>9151569</gpsLaenge>
<gpsBreite>48432079</gpsBreite>
<befundtour>false</befundtour>
<abholtour>true</abholtour>
<druck>true</druck>
<versandtour>false</versandtour>
<status>A</status>
</tourpos>
</customer>
毕竟我想要这样的东西:
XXXXX|0|AAAAA|073316|10:50|
但最后我得到这样的结果:
XXXXX|0|AAAAA|073316 773802|10:50:00 00:50:00
剧本:
$file= .\FFFFF.*.xml
if (Test-Path -path $file){
$xml = [xml](Get-Content $file)
$xml.tourCustomer.customer | Select-Object @(
@{l="LaborId";e={$_.laborid}},
@{l="Kundennr";e={0}},
@{l="Kürzel";e={$_.kundenid}},
@{l="Tour";e={$_.tourpos.tourid}},
@{l="Zeit";e={$_.tourpos.tourzeit}}) | Where-Object {$null -ne $_.Tour -and $null -ne $_.Zeit}
|ConvertTo-Csv -Delimiter '|'-NoTypeInformation | % {$_ -replace '"', ""} | Out-File
.\output_2.csv -Force -Encoding UTF8
}else
{return
}
事实上,我不能只为带有 true 的子集“befundtour”设置“LaborId”,但不幸的是我两者都有。
$xml.tourCustomer.customer | Select-Object @(
@{l="LaborId";e={ $_.laborid }},
@{l="Kundennr";e={ 0 }},
@{l="Kürzel";e={ $_.kundenid }},
@{l="Tour";e={ ($_.tourpos | where befundtour -eq 'true').tourid }},
@{l="Zeit";e={ ($_.tourpos | where befundtour -eq 'true').tourzeit }}
)
产出
LaborId : XXXXX
Kundennr : 0
Kürzel : AAAAA
Tour : 073316
Zeit : 10:50:00
或者,通过 ConvertTo-CSV -NoTypeInformation
"LaborId","Kundennr","Kürzel","Tour","Zeit"
"XXXXX","0","AAAAA","073316","10:50:00"
只要每个 <customer>
只有一个 <befundtour>true</befundtour>
,那将有效。如果不能保证,您需要定义更具体的过滤条件,或使用 -join
制作一个“in-column”值列表。
我正在尝试将 XML 文件转换为 CSV。为此,我需要检查某些集合(“laborid”和“kundenid”)以及子集的值 (“tourid”和“tourzeit”)基于“befundtour”等于true:
的子集<customer>
<laborid>XXXXX</laborid>
<kundenid>AAAAA</kundenid>
<ziellabor>BBB</ziellabor>
<tourpos>
<tourid>073316</tourid>
<tourzeit>10:50:00</tourzeit>
<MO>true</MO>
<DI>true</DI>
<MI>true</MI>
<DO>true</DO>
<FR>true</FR>
<SA>false</SA>
<SO>false</SO>
<gpsLaenge>9151569</gpsLaenge>
<gpsBreite>48432079</gpsBreite>
<befundtour>true</befundtour>
<abholtour>true</abholtour>
<druck>true</druck>
<versandtour>true</versandtour>
<status>A</status>
</tourpos>
<tourpos>
<tourid>773802</tourid>
<tourzeit>00:50:00</tourzeit>
<bemerkung><![CDATA[Briefkasten ist offen (Klappe)!]]></bemerkung>
<MO>false</MO>
<DI>false</DI>
<MI>false</MI>
<DO>false</DO>
<FR>false</FR>
<SA>false</SA>
<SO>false</SO>
<gpsLaenge>9151569</gpsLaenge>
<gpsBreite>48432079</gpsBreite>
<befundtour>false</befundtour>
<abholtour>true</abholtour>
<druck>true</druck>
<versandtour>false</versandtour>
<status>A</status>
</tourpos>
</customer>
毕竟我想要这样的东西:
XXXXX|0|AAAAA|073316|10:50|
但最后我得到这样的结果:
XXXXX|0|AAAAA|073316 773802|10:50:00 00:50:00
剧本:
$file= .\FFFFF.*.xml
if (Test-Path -path $file){
$xml = [xml](Get-Content $file)
$xml.tourCustomer.customer | Select-Object @(
@{l="LaborId";e={$_.laborid}},
@{l="Kundennr";e={0}},
@{l="Kürzel";e={$_.kundenid}},
@{l="Tour";e={$_.tourpos.tourid}},
@{l="Zeit";e={$_.tourpos.tourzeit}}) | Where-Object {$null -ne $_.Tour -and $null -ne $_.Zeit}
|ConvertTo-Csv -Delimiter '|'-NoTypeInformation | % {$_ -replace '"', ""} | Out-File
.\output_2.csv -Force -Encoding UTF8
}else
{return
}
事实上,我不能只为带有 true 的子集“befundtour”设置“LaborId”,但不幸的是我两者都有。
$xml.tourCustomer.customer | Select-Object @(
@{l="LaborId";e={ $_.laborid }},
@{l="Kundennr";e={ 0 }},
@{l="Kürzel";e={ $_.kundenid }},
@{l="Tour";e={ ($_.tourpos | where befundtour -eq 'true').tourid }},
@{l="Zeit";e={ ($_.tourpos | where befundtour -eq 'true').tourzeit }}
)
产出
LaborId : XXXXX Kundennr : 0 Kürzel : AAAAA Tour : 073316 Zeit : 10:50:00
或者,通过 ConvertTo-CSV -NoTypeInformation
"LaborId","Kundennr","Kürzel","Tour","Zeit" "XXXXX","0","AAAAA","073316","10:50:00"
只要每个 <customer>
只有一个 <befundtour>true</befundtour>
,那将有效。如果不能保证,您需要定义更具体的过滤条件,或使用 -join
制作一个“in-column”值列表。