PowerShell - фильтрация уникальных значений

У меня есть входной CSV файл со столбцом, содержащим информацию, подобную приведенной ниже:

805265
995874
805674
984654
332574
339852

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

80, 99, 98, 33

Как я могу добиться этого с помощью PowerShell?

Ответ 1

Для этого я использовал бы Group-Object (псевдоним group):

Import-Csv foo.csv | group {$_.ColumnName.Substring(0, 2)}

Count Name                      Group
----- ----                      -----
    2 80                        {805265, 805674}
    1 99                        {995874}
    1 98                        {984654}
    2 33                        {332574, 339852}

Ответ 2

Используйте Select-Object и параметр -unique:

$values =
'805265',
'995874',
'805674',
'984654',
'332574',
'339852'

$values |
  Foreach-Object { $_.Substring(0,2) } |
  Select-Object -unique

Если требуется преобразование в int, просто приведите его к [int]:

$ints =
  $values |
  Foreach-Object { [int]$_.Substring(0,2) } |
  Select-Object -unique

Ответ 3

Вы можете использовать хеш-таблицу:

$values = @(805265, 995874, 805674, 984654, 332574, 339852)

$ht = @{}

$values | foreach {$ht[$_ -replace '^(..).+','$1']++}

$ht.keys

99
98
33
80

Ответ 4

Вы можете создать новый массив с элементами, содержащими первые два символа, а затем использовать Select-Object, чтобы получить такие уникальные элементы, как этот:

$newArray = @()
$csv = Import-Csv -Path C:\your.csv
$csv | % {
    $newArray += $_.YourColumn.Substring(0, 2)
}
$newArray | Select-Object -Unique

Ответ 5

Еще один вариант вместо использования Select-Object -unique - использовать командлет Get-Unique (или его псевдоним gu; см. подробное описание здесь), как показано ниже:

$values = @(805265, 995874, 805674, 984654, 332574, 339852)
$values | % { $_.ToString().Substring(0,2) } | Get-Unique
# Or the same using the alias
$values | % { $_.ToString().Substring(0,2) } | gu