@The0dium

Сравнение двух массивов в Powershel?

Добрый день. Хотела бы попросить помощи у сообщества. Хотя бы подсказку, в каком направлении двигаться (с Powershell я на Вы, опыта нет...)
Суть задачи: Есть интернет страница с таблицей, и есть выгруженный .csv файл с почти идентичной таблицей. Мне необходимо сделать так, чтобы PS сравнивал две эти таблицы и выводил результат, в какой строке какие расхождения. Т.е. не просто номер не совпадающей строки, а всю строку целиком. Я в тупике. Код прилагаю.
$inhalt = Invoke-WebRequest -uri 'тут адрес сайта' -WebSession $Cookie

$stammArtikelTabelle = $inhalt.ParsedHtml.getElementsByTagName("table");
$stammArtikelRow = $stammArtikelTabelle[0].getElementsByTagName("tr");

$importfile = "C:\test\Stammartikel_Export.CSV" 
$import = Import-csv $importfile -Delimiter ";" -Encoding Default

function cleanInnerHtml($spalte) {
    return $spalte.innerhtml.replace(" ","").trim();
}


$stammArtikelWebseite = @();

$jumpedOverFirstElement = $false
foreach($stammArtikelCol in $stammArtikelRow) {
    if (!$jumpedOverFirstElement) { $jumpedOverFirstElement = $true; continue;}

    $spalten = $stammArtikelCol.getElementsByTagName("td");
    $newRoW = @{}
    $newRow.artikelnummer = cleanInnerHtml $spalten[0]
    $newRow.beschreibung = cleanInnerHtml $spalten[1]
    $newRow.warengruppe = cleanInnerHtml $spalten[2]
    $newRow.preisohne = cleanInnerHtml $spalten[3]
    $newRow.preismit = cleanInnerHtml $spalten[4]

    $stammArtikelWebseite += $newRoW
}   

$stammArtikelwebseite[0]

#exit
Write-Host " "

$stammArtikelcsv = @();

foreach($row in $import) {
    $matnr = $row.Matnr.TrimStart('0')
    $bezeichnung = $row.Bezeichnung.Trim()
    $ltext = $row.Langtext.Trim()
    $waren = $row.Warengruppe
    $noMWST = $row.'Preis ohne MWST'.Trim()
    $MWST = $row.'Preis mit MWST'.Trim()
    $hersteller = $row.'Hersteller '

    foreach($spalte in $row){
        $newRow1 = @{}
        $newRow1.artikelnummer = $matnr
        $newRow1.beschreibung  = $bezeichnung
        $newRow1.warengruppe   = $waren
        $newRow1.preisohne     = $noMWST + " €"
        $newRow1.preismit      = $MWST + " €"
        $stammArtikelcsv += $newRow1
        }
    }
$stammArtikelcsv[0]

foreach ($newRoW in $stammArtikelwebseite[0]) {
    if ($stammArtikelcsv[0] -notcontains $newRoW) {
        "$newRoW is extra"
    }

}


В общем, я привела обе таблицы к общему виду, но теперь возникла сложность именно сравнить два массива, каждый из которых содержит в себе hash-таблицу.

Буду очень благодарна за любую помощь.
Дополнение:
Общий вид html-таблицы: 602f8029e6374081967663.png
.csv выглядит примерно следующим образом:
0000000000000060186082;AccessPoint Cisco Catalyst 92120AXI ;AccessPoint/Repeater; 700,00 ; 833,00

Надо, чтобы построчно сравнивался массив, и, например, если цена поменялась - создавался еще один массив, где бы стояло наименование товара и изменившаяся цена.

Что сейчас выводит скрипт:
602f825886096132966672.jpeg

На данный момент видно, что я сделала из двух таблиц максимально похожие массивы, чтобы PS было удобнее сравнивать. Но как выполнить это сравнение, по прежнему остается для меня загадкой. Надеюсь, не слишком мудрено описала)
  • Вопрос задан
  • 1776 просмотров
Решения вопроса 1
@MaxKozlov Куратор тега PowerShell
Вам потребуется преобразовать ваши hastable в [PSCustomObject] и
изучить возможности Compare-Object

Преобразовать просто - [PSCustomObject]$hastable
А потом, когда у вас будут объекты, а не хеши, их можно сравнивать по отдельным свойствам
В частности, можно будет попробовать
#...
# вместо # $stammArtikelWebseite += $newRoW
$stammArtikelWebseite += [PSCustomObject]$newRoW
# ...
# то что в $Import - уже объекты, их можно менять на месте
# или также из вашего хеша сделать 
# вместо # $stammArtikelcsv += $newRow1
$stammArtikelcsv += [PSCistomObject]$newRow1
#...

# А потом:
Compare-Object -ReferenceObject  $stammArtikelWebseite  -DifferenceObject $stammArtikelcsv -Property preisohne
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@alhaos
$tupel1 = [System.Tuple]::Create(1, "cisco", 100)
$tupel2 = [System.Tuple]::Create(1, "cisco", 200)
$tupel3 = [System.Tuple]::Create(1, "cisco", 100)

$tupel1 -eq $tupel2
$tupel2 -eq $tupel3
$tupel1 -eq $tupel3


Есть такие тупли )))
aka картежи, их можно сравнивать целиком

False
False
True
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы