PowerShell - обновить значение переменной из другой переменной - PullRequest
0 голосов
/ 23 ноября 2018

Я пытаюсь обновить количество значений в $ Table1 от другого $ Table2.

Скажем, у меня есть $ Table1 (в данном случае импортированный файл CSV):

Model   ModelID   Blah
abc     0         Blah
ghi     0         Blah
mno     0         Blah

и у меня есть $ Table2 (в данном случае полученный из источника данных):

name    id
abc     11
def     12
ghi     13
jkl     14
mno     15
pqr     16
etc.

Я пытаюсь обновить значения в $ Table1. "ModelID" из $ Table2. "id"

WHERE $Table1."Model" = $Table2."name"

В SQL я бы сделал что-то вроде:

UPDATE $Table1
SET ModelID = $Table2."id"
WHERE $Table1."Model" = $Table2."name"

Как мне выполнить условные обновления, основанные на соединениях столбцов в переменной PowerShell?

Я искалв:

-replace... (I can't seem to do conditional replaces based on joins)

Add-Member -MemberType NoteProperty "modelID" -Value ... (again, I can't seem to set the value based on joins)

foreach($item in $Table1)
{
    $Table1."ModelID" = $Table2."id" 
    where ?????
}.. (again, I can't seem to set the value based on joins)

Я переусердствую здесь пудинг?

Ответы [ 5 ]

0 голосов
/ 23 ноября 2018

А как же так ...

$Data = @"
Model,ModelID,Blah
abc,0,Blah
ghi,0,Blah
mno,0,Blah
"@ | ConvertFrom-Csv

$Reference = @"
Name,Id
abc,11
def,12
ghi,13
jkl,14
mno,15
pqr,16
"@ | ConvertFrom-Csv

$Data | ForEach-Object {
    $Local:ThisModelKey = $_.Model
    if ($Reference.Name -contains $ThisModelKey) {
    $_.ModelID = (@($Reference | Where-Object { $_.Name -like $ThisModelKey } ))[0].ID
    }
}

Результат ...

$Data

Model ModelID Blah
----- ------- ----
abc   11      Blah
ghi   13      Blah
mno   15      Blah
0 голосов
/ 23 ноября 2018

вот альтернативный метод.он использует технику «действовать против коллекции» [я думаю, она была введена в v4].хеш-таблица по-прежнему самый быстрый способ сделать это, когда список поиска большой, хотя.[ ухмылка ]

$OneTable = @'
Model, ModelID, Blah
abc, 0, Blah
ghi, 0, Blah
mno, 0, Blah
'@ | ConvertFrom-Csv

# removed one line [ghi, 13] to allow for "no match" error test
$TwoTable = @'
Name, ID
abc, 11
def, 12
jkl, 14
mno, 15
pqr, 16
'@ | ConvertFrom-Csv

foreach ($OT_Item in $OneTable)
    {
    $Lookup = $TwoTable -match $OT_Item.Model
    if ($Lookup)
        {
        $OT_Item.ModelID = $Lookup.ID
        }
        else
        {
        Write-Warning ('No matching Model was found for [ {0} ].' -f $OT_Item.Model)
        }
    }

$OneTable

вывод ...

WARNING: No matching Model was found for [ ghi ].

Model ModelID Blah
----- ------- ----
abc   11      Blah
ghi   0       Blah
mno   15      Blah
0 голосов
/ 23 ноября 2018

Вот код, который, как мне кажется, может помочь.

foreach($i in $t1)
{
    foreach($j in $t2)
    {
        if($i.'model' -eq $j.'id')
        {
            $i.'modelid' = $j.'name'
            break
        }
    }
}

Для каждого элемента в таблице1 ищите шаблон в таблице2, если найдете совпадение, измените значение в таблице 1.

0 голосов
/ 23 ноября 2018

Менее грязный вариант с использованием хеш-таблицы для поиска идентификатора из модели.
Использование здесь строк в качестве источника.

## Q:\Test\2018\11\23\SO_53440594.ps1
$table1 = @"
Model,ModelID,Blah
abc,0,Blah
ghi,0,Blah
mno,0,Blah
"@ | ConvertFrom-Csv

$Hashtable2 = @{}
@"
Name,Id
abc,11
def,12
ghi,13
jkl,14
mno,15
pqr,16
"@ | ConvertFrom-Csv | ForEach-Object {$Hashtable2.Add($_.Name,$_.Id)}

ForEach ($Row in $table1){
  if($Hashtable2.Containskey($Row.Model)){
    $Row.ModelID = $Hashtable2[$Row.Model]
  } else {
    "Model {0} not present in `$table2" -f $Row.Model
  }
}
$table1

Пример вывода:

Model ModelID Blah
----- ------- ----
abc   11      Blah
ghi   13      Blah
mno   15      Blah
0 голосов
/ 23 ноября 2018

Это ОЧЕНЬ грязно, но похоже, что работа сделана.

$Table2 = import-csv C:\temp\test.csv
$Table1 = import-csv C:\temp\Test55.csv

Foreach($item in $Table1){
    Foreach($tab2 in $Table2){
        If($tab2.name -match $item.model){
            $item.ModelID = $tab2.id
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...