तुलना-वस्तु बहु मानों की शकल

Dec 29 2020

कृपया, क्या आप मुझे कई फ़ील्ड कॉलम के साथ सीएसवी फ़ाइल को संभालने के लिए एक समाधान खोजने में मदद कर सकते हैं

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

मुश्किल:

  1. गोंजालेज और हॉल को टीमों 3 में जोड़ें
  2. टीम -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                          <=

जवाब

2 robdy Dec 29 2020 at 20:53

मैं भिन्नताओं को खोजने के लिए पहले वस्तुओं की तुलना करूँगा (ध्यान दें कि मैं दो गुणों की तुलना करता हूं: विभिन्न टीमों के मैचों की सदस्यता के मामले में लापता प्रविष्टियों से बचने के लिए टीम और सदस्य) और फिर मिलान वाली वस्तुओं से निर्मित सरणियों की तुलना करें:

$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
}
js2010 Dec 30 2020 at 01:02

आप 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       <=