You might want to use json instead of csv which supports arrays and numbers. Otherwise the teams look like two semicolon separated strings.
file1.json
[
{"Teams":"Team1","Category":"A","Members":["Smith","Johnson"]},
{"Teams":"Team1","Category":"C","Members":["Jones","Miller","Garcia"]},
{"Teams":"Team3","Category":"E","Members":["Wilson","Martinez"]},
{"Teams":"Team4","Category":"A","Members":["Martin","Jackson","White","Williams"]}
]
file2.json
[
{"Teams":"Team1","Category":"A","Members":["Smith","Johnson"]},
{"Teams":"Team2","Category":"C","Members":["Jones","Miller","Garcia"]},
{"Teams":"Team3","Category":"E","Members":["Wilson","Martinez","Gonzalez","Hall"]},
{"Teams":"Team4","Category":"A","Members":["Martin","Jackson","Williams"]}
]
$1 = cat file1.json | convertfrom-json
$2 = cat file2.json | convertfrom-json
Compare-Object $1 $2 -Property Members -PassThru
Teams Category Members SideIndicator
----- -------- ------- -------------
Team3 E {Wilson, Martinez, Gonzalez, Hall} =>
Team4 A {Martin, Jackson, Williams} =>
Team3 E {Wilson, Martinez} <=
Team4 A {Martin, Jackson, White, Williams} <=
Here's a closer answer. Run compare-object on members only one line at a time, then add teams and category to it.
$1 = cat file1.json | convertfrom-json
$2 = cat file2.json | convertfrom-json
for($i = 0; $i -lt $1.length; $i++) {
compare-object $1[$i].members $2[$i].members |
select @{n='Teams'; e={$1[$i].teams}},
@{n='Category'; e={$1[$i].Category}},
@{n='Members'; e={$_.inputobject}},
sideindicator
}
Teams Category Members SideIndicator
----- -------- ------- -------------
Team3 E Gonzalez =>
Team3 E Hall =>
Team4 A White <=
Here's another way using a zip function PowerShell/CLI: "Foreach" loop with multiple arrays on both lists of objects.
$1 = cat file1.json | convertfrom-json
$2 = cat file2.json | convertfrom-json
function Zip($a1, $a2) { # function allows it to stream
while ($a1) {
$x, $a1 = $a1 # $a1 gets the tail of the list
$y, $a2 = $a2
[tuple]::Create($x, $y)
}
}
zip $1 $2 | % {
$whole = $_ # will lose this $_ in the select
compare-object $whole.item1.members $whole.item2.members |
select @{n='Teams'; e={$whole.item1.teams}},
@{n='Category'; e={$whole.item1.Category}},
inputobject,sideindicator
}
Teams Category InputObject SideIndicator
----- -------- ----------- -------------
Team3 E Gonzalez =>
Team3 E Hall =>
Team4 A White <=