@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 было удобнее сравнивать. Но как выполнить это сравнение, по прежнему остается для меня загадкой. Надеюсь, не слишком мудрено описала)
  • Вопрос задан
  • 1552 просмотра
Решения вопроса 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
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы