2015-12-09 2 views
0

У меня вопрос о перестановке. Например, у меня есть следующая таблица:Как создать массив перестановок в powershell?

enter image description here

Я хочу сделать перестановку с этой таблицей. В первом столбце есть два варианта: три варианта во втором и третьем столбцах. Массив перестановок вывод должен выглядеть следующим образом:

enter image description here

Есть 18 вариантов для организации iterms в 1-3 столбцах. Вопрос в том, как использовать powershell для создания скрипта для получения такого массива? И как вывести этот массив в excel?

+0

Это массив объектов (есть ли заголовки столбцов?) Или массив массивов (без заголовков столбцов)? – TheMadTechnician

+0

@ TheMadTechnician, Да, я забыл поставить заголовки. Столбец 1, столбец 2 и столбец 3. – rock

ответ

2

Хорошо, отделив отличный ответ от Joey, для итерации по массиву с известными столбцами вы можете сделать следующее (PowerShell v3 или выше, это можно сделать в более старых версиях, но усложняется).

#clean up any existing variables 
Remove-Variable array, alliterations -ea 4 

#create the sample array 
[array]$array += [PSCustomObject]@{ 
    'Column 1' = 'Single load' 
    'Column 2' = 'MAT1' 
    'Column 3' = 'Country A' 
} 
[array]$array += [PSCustomObject]@{ 
    'Column 1' = 'Uniform distributed load' 
    'Column 2' = 'MAT2' 
    'Column 3' = 'Country B' 
} 
[array]$array += [PSCustomObject]@{ 
    'Column 1' = '' 
    'Column 2' = 'MAT3' 
    'Column 3' = 'Country C' 
} 

#Create all iterations from that array 
ForEach($a in ($array.'Column 1'|Where{$_})){ 

    ForEach($b in ($array.'Column 2'|Where{$_})){ 

     ForEach($c in ($array.'Column 3'|Where{$_})){ 
      [array]$AllIterations += [PSCustomObject]@{ 
       'Column 1' = $a 
       'Column 2' = $b 
       'Column 3' = $c 
      } 
     } 
    } 
} 

#Display results 
$AllIterations 

Это будет генерировать массив:

Column 1     Column 2 Column 3 
--------     -------- -------- 
Single load    MAT1  Country A 
Single load    MAT1  Country B 
Single load    MAT1  Country C 
Single load    MAT2  Country A 
Single load    MAT2  Country B 
Single load    MAT2  Country C 
Single load    MAT3  Country A 
Single load    MAT3  Country B 
Single load    MAT3  Country C 
Uniform distributed load MAT1  Country A 
Uniform distributed load MAT1  Country B 
Uniform distributed load MAT1  Country C 
Uniform distributed load MAT2  Country A 
Uniform distributed load MAT2  Country B 
Uniform distributed load MAT2  Country C 
Uniform distributed load MAT3  Country A 
Uniform distributed load MAT3  Country B 
Uniform distributed load MAT3  Country C 

Чтобы получить, что в Excel вы можете экспортировать в файл CSV, как предложил Джо, или вы можете иметь PowerShell открытые Excel и вставить в него данные непосредственно.

#Copy array to clipboard as a tab delimited CSV 
$AllIterations | ConvertTo-CSV -Delimiter "`t" -NoTypeInfo | Select -Skip 1 | Clip 

#Open Excel, create a blank workbook, and paste the data in at cell A1 
$XL = New-Object -ComObject Excel.Application 
$WB = $XL.Workbooks.Add() 
$XL.Visible = $true 
$XL.ActiveSheet.Cells.Item(1).PasteSpecial() 
+0

Отличный сценарий. – rock

1

Вы можете легко сделать это с помощью вложенных циклов:

$(foreach ($a in 'Single Load','Uniform distributed load') { 
    foreach ($b in 'MAT1','MAT2','MAT3') { 
    foreach ($c in 'Country A','Country B','Country C') { 
     New-Object -Prop @{Column1=$a;Column2=$b;Column3=$c} 
    } 
    } 
}) | Export-Csv foo.csv -NoTypeInformation 

Файл CSV можно открыть с помощью Excel.

+0

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

+0

У вас есть другой метод, который может решить большой объем данных? @joey – rock

+0

Все в порядке, вы просто делаете 'ForEach ($ a in ($ array.'Column 1 '| Where {$ _})) и так далее. Если вы не подключаетесь к 'Where', он будет итерации для пустых значений. – TheMadTechnician

Смежные вопросы