在Powershell中使用来自XML的数据更新csv文件

时间:2018-09-21 13:26:12

标签: xml powershell

出于教育目的,我试图通过XML表格更新CSV文件。 更新我的CSV,其中客户端等于nummer(不对其进行硬编码)不起作用。有人可以看到我在做什么吗?

XML:

    <wijzigen>
    <klant nummer="4">
        <stad>Troy</stad>
        <provincie>TR</provincie>
        <provincieVoluit>Troas</provincieVoluit>
        <adres>happy horse street 27</adres>
        <postcode>1200BC</postcode>
    </klant>
    <klant nummer="7">
        <stad>Achaea</stad>
    </klant>
</wijzigen> 

Powershell:

function Wijzig-Klant{
$klantnummer = $wijziging.nummer
$stad = $wijziging.stad
$provincie = $wijziging.provincie
$provincieVoluit = $wijziging.provincieVoluit
$adres = $wijziging.adres
$postcode = $wijziging.postcode

$data = Import-Csv -Path "C:\Projecten\PowerShell\Data_v1.0.csv" -Delimiter ";"

$update = $data | Where-Object {$_.klantnummer -eq $klantnummer} | ForEach-Object {
           $_.stad = $stad 
           $_.provincie = $provincie
           $_.provincieVoluit = $provincieVoluit
           $_.adres = $adres
           $_.postcode = $postcode
}
$update | Export-Csv ("C:\Projecten\PowerShell\" + $datumVandaag + "Data_v1.0.csv") -Delimiter ";" -NoTypeInformation -Append

}

在powershell中读取XML文件中的数据:

$wijziging = $XMLDocument.klantadministratie.wijzigen.klant
[xml]$XMLDocument = Get-Content -Path 'C:\Projecten\PowerShell\XML Wijzigingen v1.0.xml'

1 个答案:

答案 0 :(得分:0)

我怀疑您的XML模式实际上是:

$xml = [xml]@'
<?xml version="1.0"?>
<klantadministratie>
    <wijzigen>
        <klant nummer="4">
            <stad>Troy</stad>
            <provincie>TR</provincie>
            <provincieVoluit>Troas</provincieVoluit>
            <adres>happy horse street 27</adres>
            <postcode>1200BC</postcode>
        </klant>
        <klant nummer="7">
            <stad>Achaea</stad>
        </klant>
    </wijzigen>
</klantadministratie>
'@

根据您的示例。有了这些知识,您就需要进行null检查,因为并非所有值都已填充:

$path = 'C:\Projecten\PowerShell\Data_v1.0.csv'
Import-Csv -Path $path -Delimiter ';' | ForEach-Object {
    $set = $xml.SelectSingleNode("//klant[@nummer='$($PSItem.klantnummer)']")

    if ($set.stad)            { $PSItem.stad = $set.stad }
    if ($set.provincie)       { $PSItem.provincie = $set.provincie }
    if ($set.provincieVoluit) { $PSItem.provincieVoluit = $set.provincieVoluit }
    if ($set.adres)           { $PSItem.adres = $set.adres }
    if ($set.postcode)        { $PSItem.postcode = $set.postcode }

    $PSItem # return the updated row to the pipeline
} | Export-Csv -Path "C:\Projecten\PowerShell\${datumVandaag}Data_v1.0.csv" -NoTypeInformation -Append

最后,我认为您的问题不是将对象返回到管道中。