तुलना-वस्तु बहु मानों की शकल
कृपया, क्या आप मुझे कई फ़ील्ड कॉलम के साथ सीएसवी फ़ाइल को संभालने के लिए एक समाधान खोजने में मदद कर सकते हैं
File1.csv
Teams,Category,Members
Team1,A,Smith;Johnson
Team1,C,Jones;Miller;Garcia
Team3,E,Wilson;Martinez
Team4,A,Martin;Jackson;White;Williams
File2.csv
Teams,Category,Members
Team1,A,Smith;Johnson
Team2,C,Jones;Miller;Garcia
Team3,E,Wilson;Martinez;Gonzalez;Hall
Team4,A,Martin;Jackson;Williams
मुश्किल:
- गोंजालेज और हॉल को टीमों 3 में जोड़ें
- टीम -4 पर व्हाइट निकालें
$1 = Import-Csv -Path ".\File1.csv" -Delimiter ',' $2 = Import-Csv -Path ".\File2.csv" -Delimiter ','
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 <=
क्या उम्मीद है:
Teams Category Members SideIndicator
Team3 E Gonzalez and Hall =>
Team4 A White <=
जवाब
मैं भिन्नताओं को खोजने के लिए पहले वस्तुओं की तुलना करूँगा (ध्यान दें कि मैं दो गुणों की तुलना करता हूं: विभिन्न टीमों के मैचों की सदस्यता के मामले में लापता प्रविष्टियों से बचने के लिए टीम और सदस्य) और फिर मिलान वाली वस्तुओं से निर्मित सरणियों की तुलना करें:
$1 = Import-Csv -Path ".\File1.csv" -Delimiter ',' $2 = Import-Csv -Path ".\File2.csv" -Delimiter ','
$comparisonRes = Compare-Object $1 $2 -Property Teams,Members -PassThru foreach ($obj in $comparisonRes | Where-Object SideIndicator -eq "=>") { # $obj = ($comparisonRes | Where-Object SideIndicator -eq "=>")[0] $matchingEntry = $1 | Where-Object {$_.Teams -eq $obj.Teams} $matchingEntryMembers = $matchingEntry.Members -split ";" $currentEntryMembers = $obj.Members -split ";" $diffMembers = Compare-Object $matchingEntryMembers $currentEntryMembers
# Uncomment to log
# $diffMembers # Do something with $diffMembers here
}
आप csv के बजाय json का उपयोग करना चाह सकते हैं जो सरणियों और संख्याओं का समर्थन करता है। अन्यथा टीमें दो अर्धविराम से अलग तार की तरह दिखती हैं।
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} <=
यहाँ एक करीब जवाब है। एक बार में केवल एक पंक्ति के सदस्यों पर तुलना-ऑब्जेक्ट चलाएँ, फिर इसमें टीम और श्रेणी जोड़ें।
$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 <=
यहां एक ज़िप फ़ंक्शन का उपयोग करने का दूसरा तरीका है PowerShell / CLI: ऑब्जेक्ट की दोनों सूचियों पर कई सरणियों के साथ "फ़ॉरच" लूप ।
$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 <=