Author Posts

April 4, 2017 at 3:40 pm

I need some array assistance, I have a list and I need to pull elements from this list and produce some output. I have used powershell for years, but never consider myself as a programmer and there are some simple things a true coder might have a quick answer for. I am doing some research and playing with some things, but I wanted to post a question here in to see what a more experience coder might have to say...

I have a list of names and values produced in a piece of code...I want to take pieces of multiple elements and create a new output array.

NAME,value
Apple,red
Apple,fruit
Turtle,green
Turtle,tail
Tree,leafy
Tree,tall
Cloud,white
Cloud,fluffy

I want to extract the elements above and produce a list like so...

Name,value1,value2
Apple,red,fruit
Turtle,green,tail
Tree,leafy,tall
Cloud,white,fluffy

I can think of a few kludgy ways to do it but I could use an example. As I begin to code up my own creations I will add them, but I am almost certain an experienced coder may have a faster and more elegant example. Thanks!

April 4, 2017 at 7:26 pm

I think I have a good start, but for some reason the $NewReport += $combine line is not giving me all the values, in my test echos, I am referencing the correct variable.

$a = "Apple","red"
$b = "Apple","fruit"
$c = "Turtle","green"
$d = "Turtle","tail"
$e = "Tree","leafy"
$f = "Tree", "tall"
$g = "Cloud","white"
$h = "Cloud","fluffy"


$List = $a,$b,$c,$d,$e,$f,$g,$h
$report = @()
$combine = @()
$NewReport = @()

foreach ($item in $List){

$row = "" | select Name,Value1
$row.Name = $item[0]
$row.Value1 = $item[1]
$report += $row

}

echo $report

echo "`nFirst Report Complete`n`n"



for($i=0;$i -le $report.length-1;$i++){
echo "loop $i"

echo $report[$i].Name
echo $report[$i].Value1
echo $report[$($i+1)].Value1

	if ($report[$i].Name -eq $report[$($i+1)].Name){
	echo "true"
	$combine = "" | select Name,ValueA,ValueB
	$combine.Name = $report[$i].Name
	$combine.ValueA = $report[$i].Value1
	$combine.ValueB = $report[$($i+1)].Value1
	$NewReport += $combine
	echo $combine
	}

}
echo "`n Start NewReport `n"
echo $NewReport

Here is my output to this script...notice the output after "start NewReport" only shows the .Name portion

Powershell> .\Array000.ps1

Name   Value1
----   ------
Apple  red   
Apple  fruit 
Turtle green 
Turtle tail  
Tree   leafy 
Tree   tall  
Cloud  white 
Cloud  fluffy

First Report Complete


loop 0
Apple
red
fruit
true
Apple        
loop 1
Apple
fruit
green
loop 2
Turtle
green
tail
true
Turtle       
loop 3
Turtle
tail
leafy
loop 4
Tree
leafy
tall
true
Tree         
loop 5
Tree
tall
white
loop 6
Cloud
white
fluffy
true
Cloud        
loop 7
Cloud
fluffy

 Start NewReport 

Apple        
Turtle       
Tree         
Cloud        

April 4, 2017 at 7:55 pm

I have managed to get it to work, appearently it appears on the $NewReport I had to use |ft to get multiple elements to appear, so they were there all along..

** this list assumes that the name pairs are next to each other..for my purposes of what I am working on this is ok since my output will always be this way...

So, is there a more experienced way to do this? My solution required me to reference the element by index number and do a little math to get the value of the next match....

$a = "Apple","red"
$b = "Apple","fruit"
$c = "Turtle","green"
$d = "Turtle","tail"
$e = "Tree","leafy"
$f = "Tree", "tall"
$g = "Cloud","white"
$h = "Cloud","fluffy"


$List = $a,$b,$c,$d,$e,$f,$g,$h
$report = @()
$combine = @()
$NewReport = @()

foreach ($item in $List){

$row = "" | select Name,Value1
$row.Name = $item[0]
$row.Value1 = $item[1]
$report += $row

}

echo $report

echo "`nFirst Report Complete"



for($i=0;$i -le $report.length-1;$i++){

	if ($report[$i].Name -eq $report[$($i+1)].Name){
	$combine = "" | select Name,ValueA,ValueB
	$combine.Name = $report[$i].Name
	$combine.ValueA = $report[$i].Value1
	$combine.ValueB = $report[$($i+1)].Value1
	$NewReport += $combine
	}

}
$NewReport | ft

echo "`nNewReport Complete"

here is the output

Powershell> .\Array001.ps1

Name   Value1
----   ------
Apple  red   
Apple  fruit 
Turtle green 
Turtle tail  
Tree   leafy 
Tree   tall  
Cloud  white 
Cloud  fluffy

First Report Complete



Name   ValueA ValueB
----   ------ ------
Apple  red    fruit 
Turtle green  tail  
Tree   leafy  tall  
Cloud  white  fluffy



NewReport Complete

April 4, 2017 at 8:27 pm

# String
$content = '
NAME,value
Apple,red
Apple,fruit
Turtle,green
Turtle,tail
Tree,leafy
Tree,tall
Cloud,white
Cloud,fluffy' 

# Convert string then group by name
$group = $content.Trim() | ConvertFrom-Csv | Group-Object -Property Name

foreach ($g in $group){
    [PSCustomObject]@{
        Name = $g.Name
        Values = $g.Group.value}
}

# Results
# Name                                           Values                                       
# ----                                           ------                                       
# Apple                                          {red, fruit}