2016-11-21 2 views
3

Я получаю два строку, переданную в мой сценарий:Каков наилучший способ в PowerShell проанализировать эти строки?

"Project1,Project2,Project3,Project4" 
"web,batch,web,components" 

Струны приходят из инструмента в нашем DevOps набор инструментов и я не имею никакого контроля над форматом входного сигнала. Строкой 1 может быть любое количество проектов. Строка 2 будет такое же количество записей с «типа» проекта в строке 1.

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

"Project1,Project3" 
"Project2" 
"Project4" 

Я знаю, что могу сделать это с помощью пучка вложенных петлей foreach. Есть ли способ сделать это с помощью хэш-таблицы и/или массивов?

+0

'($ ввода | ConvertFrom-Csv) .PSObject.Properties | Значение группового объекта | ForEach-Object {$ _. Group.Name -join ','} ' – PetSerAl

ответ

0

только один поиск в первом списке

$projects = "Project1,Project2,Project3,Project4" -split ',' 
$types = "web,batch,web,components" -split ',' 

$linenumber = 0 

$projects |%{New-Object psObject -Property @{Project=$_;TypeProject= $types[$linenumber]};$linenumber++} | 
group TypeProject | 
select Name, @{N="Projects";E={$_.Group.Project -join ","}} 
+0

Теперь вот что я искал. Один foreach, но в основном трубопровод.Благодаря! –

6

Вы можете включить оригинальные входные строки в массивы с оператором -split:

$ProjectNames = "Project1,Project2,Project3,Project4" -split ',' 
$ProjectTypes = "web,batch,web,components" -split ',' 

Затем создайте пустой хэш-таблицы содержат тип-к-Projectname отображения

$ProjectsByType = @{} 

Наконец перебрать два массива для группировки названий проектов по типу:

for($i = 0; $i -lt $ProjectNames.Count; $i++){ 
    if(-not $ProjectsByType.ContainsKey($ProjectTypes[$i])){ 
     # Create key and entry as array if it doesn't already exist 
     $ProjectsByType[$ProjectTypes[$i]] = @() 
    } 
    # Add the project to the appropriate project type key 
    $ProjectsByType[$ProjectTypes[$i]] += $ProjectNames[$i] 
} 

Теперь вы можете создавать свои желательные строки сгруппированы по типу проекта:

$ProjectsByType.Keys |ForEach-Object { 
    $ProjectsByType[$_] -join ',' 
} 

Вы также можете создавать объекты из двух массивов и использовать Group-Object сгруппировать их:

$Projects = for($i = 0; $i -lt $ProjectNames.Count; $i++){ 
    New-Object psobject -Property @{ 
     Name = $ProjectNames[$i] 
     Type = $ProjectTypes[$i] 
    } 
} 

$Projects |Group-Object -Property Type 

Это более интересно если вы хотите продолжить обработку проектов, если вам просто нужны строки, первый подход будет проще

+0

По сути, у меня получилось, но немного более эффективно. Благодарю. –

+0

Упрощенный: '$ ProjectsByType [$ ProjectTypes [$ i]] + = @ ($ ProjectNames [$ i])'. –

5

На самом деле нет элегантного способ объединения двух массивов таким образом со встроенными методами. Несколько запутанный путь будет следующим:

$projects = $projectString -split ',' 
$types = $typeString -split ',' 
0..($projects.Count) | group { $types[$_] } | % { $projects[$_.Group] -join ',' } 

Однако, это сначала генерирует индексы в массивы в группе и форматировать их позже, который по своей природе немного ненадежный (и не очень понятно). Я, как правило, предварительно обработать данные на самом деле отражает то, что я работаю на:

$projects = $projectString -split ',' 
$types = $typeString -split ',' 
$projectsWithType = 0..($projects.Count) | % { 
    [pscustomobject]@{ 
    Project = $projects[$_] 
    Type = $types[$_] 
    } 
} 
$projectsWithType | group Type | % { $_.Group -join ',' } 

Это делает фактические данные munging задачи гораздо понятнее.

+0

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

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