Powershell: объединение списка хэш-таблиц - взятие последнего при столкновении - PullRequest
1 голос
/ 10 февраля 2020

В настоящее время я пытаюсь объединить список из N хеш-таблиц - где каждая из таблиц содержит метку времени вместе с другим списком хеш-таблиц.

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

Например:

@(
    @{
       week = '2020-05'
       participants = @(
           @{
               name = 'user A'
               age = 35
               address = 'city A'
           },
           @{
               name = 'user B'
               age = 16
               address = 'city B'
           }
       )
    },@{
       week = '2020-04'
       participants = @(
           @{
               name = 'user A'
               age = 35
               address = 'city A'
           },
           @{
               name = 'user B'
               age = 16
               address = 'city A'
           },
           @{
               name = 'user C'
               age = 42
               address = 'city B'
           }
       )
    }
)

Обратите внимание, что для интерпретации в 2020-05 гг. мы получили 2 пользователей, а в 2020-04 гг. мы получили 3.

Теперь конечная цель - получить список, подобный этому:

result = @(
    @{
        week = '2020-05'
        name = 'user A'
        age = 35
        address = 'city A'
    },
    @{
        week = '2020-05'
        name = 'user B'
        age = 16
        address = 'city B'
    },
    @{
        week = '2020-04'
        name = 'user C'
        age = 42
        address = 'city B'
    }
)

Мой вопрос сейчас: возможно ли решить эту проблему, не имея явного l oop - но с foreach или выберите объект? Я уже смог получить массив уникальных имен пользователей, используя select object / Different - но здесь меня интересует не только список возможных имен - но и комбинация имени / возраста и адреса.

1 Ответ

1 голос
/ 11 февраля 2020

Поместите это здесь, поскольку у него есть код и, следовательно, он слишком длинный для секции комментариев.

Но ... но «пользователь b» находится в обеих неделях, но по разным адресам. В обычной мысли это два разных человека, потому что их место жительства находится в двух разных местах. Итак, ваш конечный результат, к которому вы стремитесь, если это так, недействителен.

Clear-Host

@(
    @{
       week = '2020-05'
       participants = @(
           @{
               name = 'user A'
               age = 35
               address = 'city A'
           },
           @{
               name = 'user B'
               age = 16
               address = 'city B'
           }
       )
    },@{
       week = '2020-04'
       participants = @(
           @{
               name = 'user A'
               age = 35
               address = 'city A'
           },
           @{
               name = 'user B'
               age = 16
               address = 'city A'
           },
           @{
               name = 'user C'
               age = 42
               address = 'city B'
           }
       )
    }
) | 
ConvertTo-Json -Depth 3 | 
ConvertFrom-Json | 
Select -ExpandProperty SyncRoot | 
Select Week -ExpandProperty participants

# Results
<#
name   age address week   
----   --- ------- ----   
user A  35 city A  2020-05
user B  16 city B  2020-05
user A  35 city A  2020-04
user B  16 city A  2020-04
user C  42 city B  2020-04
#>

Использование Select -Unique

ConvertTo-Json -Depth 3 | 
ConvertFrom-Json | 
Select -ExpandProperty SyncRoot | 
Select Week -ExpandProperty participants | 
Select -Unique Name, age, address

# Results
<#
name   age address
----   --- -------
user A  35 city A 
user B  16 city B 
user B  16 city A 
user C  42 city B
#>

Конечно, удаление города будет дайте вам три, за которыми вы после, ну, я просто показываю здесь имя и возраст. Если имя пользователя не может быть абсолютно уверенным в его уникальности, тогда, ну, вы знаете.

ConvertTo-Json -Depth 3 | 
ConvertFrom-Json | 
Select -ExpandProperty SyncRoot | 
Select Week -ExpandProperty participants | 
Select -Unique Name, age

# Results
<#
name   age
----   ---
user A  35
user B  16
user C  42
#>

Теперь получение адреса и недели обратно в список перед преобразованием обратно в таблицу has - это еще одно важно, так как это не будет доступно в этом последнем утверждении Select.

И наконец, какова причина (ы), по которой вы не используете al oop, если это дает вам необходимые результаты? Что касается моих экспериментов до сих пор, это было бы гораздо проще, чем то, что я пробовал до сих пор и что я выложил здесь.

Обновление

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

# Convert JSON and use Sort unique to work with data
Clear-Host
$HasheTableExport | 
ConvertTo-Json -Depth 3 | 
ConvertFrom-Json | 
Select -ExpandProperty SyncRoot | 
Select Week -ExpandProperty participants | 
Sort-Object -Property name -Unique

<#
# Results

name   age address week   
----   --- ------- ----   
user A  35 city A  2020-05
user B  16 city B  2020-05
user C  42 city B  2020-04
#>

# View as JSON
Clear-Host
$HasheTableExport | 
ConvertTo-Json -Depth 3 | 
ConvertFrom-Json | 
Select -ExpandProperty SyncRoot | 
Select Week -ExpandProperty participants | 
Sort-Object -Property name -Unique | 
ConvertTo-Json

# Results
<#
[
    {
        "name":  "user A",
        "age":  35,
        "address":  "city A",
        "week":  "2020-05"
    },
    {
        "name":  "user B",
        "age":  16,
        "address":  "city B",
        "week":  "2020-05"
    },
    {
        "name":  "user C",
        "age":  42,
        "address":  "city B",
        "week":  "2020-04"
    }
]
#>

Затем используйте / конвертируйте по мере необходимости.

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