Сравнение пар массивов в Powershell - PullRequest
0 голосов
/ 03 мая 2018

У меня есть несколько пар массивов. Первая пара содержит несколько строк.

Второй содержит метку времени, принадлежащую строке в той же позиции первого массива.

Вот две пары массивов для примера:

#String array
M681
T9997
E61
H717
K700

#Timestamp Array
11:00
11:05
11:05
11:10
11:15

Вторая пара массивов будет выглядеть так:

#String array
B722
T732
L999
M681
I125

#Timestamp Array
11:00
11:00
11:05
11:10
11:15

Я хочу найти совпадения, в которых строка состоит из двух пар, а затем я хочу измерить разницу во времени между двумя записями.

Сравнение строковых массивов было просто сделано (Compare-Object -IncludeEqual -ReferenceObject $a_string -DifferenceObject $b_string -ExcludeDifferent).InputObject, но с этим я не смог сравнить отвечающие метки времени.

Итак, моей следующей идеей было объединить каждую пару в хеш-таблицу:

$hash = @{}
$hash.Add($a_string[$i],$a_timestamp[$i])

Но я заметил, что это не сработает в моей среде, поскольку строки и метки времени могут повторяться в одном массиве, поэтому установка одной из них в качестве ключа хэша будет невозможна.

Затем я попытался создать хеш-таблицу с массивом в качестве значения и индексом в качестве ключа:

$hash.Add($indexNumber,@($a_string[$i],$a_timestamp[$i]))

Несмотря на то, что $hash.indexNumber печатает оба значения, я не могу получить значения на $hash.indexNumber[0] / $hash.indexNumber[1]

Буду признателен, если кто-нибудь расскажет мне о лучших практиках в такой ситуации или подскажет, как я могу успешно получить отдельные значения массива внутри хеша и сравнить их с другими значениями массива в разных хешах.

С уважением, Paxz.

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Так что это относительно наивное решение, и, возможно, потребуется некоторая работа для правильной обработки крайних случаев, но, надеюсь, оно поможет вам двигаться в правильном направлении:

$arrayNames1 = @('M681','T9997','E61','H717','K700')
$arrayTimes1 = @('11:00','11:05','11:05','11:10','11:15')
$arrayNames2 = @('B722','T732','L999','M681','I125')
$arrayTimes2 = @('11:00','11:00','11:05','11:10','11:15')

function Find-AllIndexesOf{
    param(
        $array,
        $term
    )
    $i = 0
    foreach($item in $array){
        if($item -eq $term){
            $i
        }
        $i++
    }
}

foreach($name in $arrayNames1){
    if($arrayNames2.Contains($name)){
        $array1Locations = Find-AllIndexesOf $arrayNames1 $name
        $array2Locations = Find-AllIndexesOf $arrayNames2 $name
        $i = 0
        foreach($location in $array1Locations){
            $thisTime1 = [datetime]$arrayTimes1[$array1Locations]
            $thisTime2 = [datetime]$arrayTimes2[$array2Locations[$i]]
            Write-Host ('I found a time difference for {0} that started at {1} and ended at {2} for {3} total minutes' -f $name, $thisTime1, $thisTime2, ($thisTime2 - $thisTime1).TotalMinutes)
            $i++
        }
    }
}
0 голосов
/ 03 мая 2018

Но я заметил, что это не сработает в моей среде, поскольку строки и метки времени могут повторяться в одном массиве, поэтому установка одной из них в качестве ключа хэша будет невозможна.

Мне неясно, почему простая хеш-таблица не работает в вашем случае использования.

$table = @{}
for ($i = 0; $i -lt $a_string.count; $i++){
  if(!$table.Contains($a_string[$i])){
    $table.Add($a_string[$i], @())
    $table[$a_string[$i]] += $a_timestamp[$i] 
  }else{
    $table[$a_string[$i]] += $a_timestamp[$i]
  }
}

Это создаст таблицу, сопоставленную со строками со временем, которое затем можно будет использовать для сравнения с другими парами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...