Сопоставить два XML с PowerShell и получить вычтенный третий XML? - PullRequest
0 голосов
/ 04 октября 2019

Я хочу сопоставить код сценария powershell supplierproductcode из файла 1 с файлом 2. Когда он найдет совпадение, он должен создать третий файл с той же информацией, но вычесть количество в файле 1 из файла 2.

файл1

<stocklevelrecord>
    <supplierproductcode>1111</supplierproductcode>
    <quantity>100</quantity>
</stocklevelrecord>
<stocklevelrecord>
    <supplierproductcode>3333</supplierproductcode>
    <quantity>100</quantity>
</stocklevelrecord>

Файл 2

<stocklevelrecord>
    <supplierproductcode>1111</supplierproductcode>
    <quantity>20</quantity>
</stocklevelrecord>
<stocklevelrecord>
    <supplierproductcode>2222</supplierproductcode>
    <quantity>30</quantity>
</stocklevelrecord>
<stocklevelrecord>
    <supplierproductcode>3333</supplierproductcode>
    <quantity>40</quantity>
</stocklevelrecord>
<stocklevelrecord>
    <supplierproductcode>4444</supplierproductcode>
    <quantity>50</quantity>
</stocklevelrecord>

Файл результатов

# quantity 100 (File 1) - quantity 20 (File 2)
<stocklevelrecord>
    <supplierproductcode>1111</supplierproductcode>
    <quantity>80</quantity>
</stocklevelrecord>
# quantity 100 (File 1) - quantity 40 (File 2)
<stocklevelrecord>
    <supplierproductcode>3333</supplierproductcode>
    <quantity>60</quantity>
</stocklevelrecord>

Я новичок в PowerShell и мне нужно руководство.

1 Ответ

0 голосов
/ 04 октября 2019

Простой подход состоит в том, чтобы перебирать записи в первом файле, искать коды во втором файле и обновлять количество.

Обратите внимание, что это лучше всего подходит для небольших файлов. Для файлов большего размера (сотни КБ или МБ) может быть полезно индексирование, например словарь, чтобы избежать загрузки всего документа в память.

function Format-XML ([xml]$xml, $indent=2)
{
    # https://devblogs.microsoft.com/powershell/format-xml/
    $StringWriter = New-Object System.IO.StringWriter
    $XmlWriter = New-Object System.XMl.XmlTextWriter $StringWriter
    $xmlWriter.Formatting = “indented”
    $xmlWriter.Indentation = $Indent
    $xml.WriteContentTo($XmlWriter)
    $XmlWriter.Flush()
    $StringWriter.Flush()
    Write-Output $StringWriter.ToString()
}

[xml] $file1 = "
<records>
    <stocklevelrecord>
        <supplierproductcode>1111</supplierproductcode>
        <quantity>100</quantity>
    </stocklevelrecord>
    <stocklevelrecord>
        <supplierproductcode>3333</supplierproductcode>
        <quantity>100</quantity>
    </stocklevelrecord>
</records>"

[xml] $file2 = "
<records>
    <stocklevelrecord>
        <supplierproductcode>1111</supplierproductcode>
        <quantity>20</quantity>
    </stocklevelrecord>
    <stocklevelrecord>
        <supplierproductcode>2222</supplierproductcode>
        <quantity>30</quantity>
    </stocklevelrecord>
    <stocklevelrecord>
        <supplierproductcode>3333</supplierproductcode>
        <quantity>40</quantity>
    </stocklevelrecord>
    <stocklevelrecord>
        <supplierproductcode>4444</supplierproductcode>
        <quantity>50</quantity>
    </stocklevelrecord>
</records>"

foreach ($file1Record in $file1.records.stocklevelrecord)
{
    $file1Code = $file1Record.supplierproductcode
    $file1Quantity = $file1Record.quantity

    foreach ($file2Record in $file2.records.stocklevelrecord)
    {
        $file2Code = $file2Record.supplierproductcode
        $file2Quantity = $file2Record.quantity

        if ($file1Code -eq $file2Code)
        {
            $file1Record.quantity = ($file1Quantity - $file2Quantity).ToString()
        }
    }
}

Clear-Host
Format-Xml $file1

# Output
#
# <records>
#   <stocklevelrecord>
#     <supplierproductcode>1111</supplierproductcode>
#     <quantity>80</quantity>
#   </stocklevelrecord>
#   <stocklevelrecord>
#     <supplierproductcode>3333</supplierproductcode>
#     <quantity>60</quantity>
#   </stocklevelrecord>
# </records>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...