2016-04-12 12 views
0

Ich habe ein PowerShell-Skript geschrieben, in dem ich die Datei lese (nicht notwendig, dass es CSV ist). In diesem habe ich zwei Spalten, Fallnummer und Cin-Nummer. Ich möchte alle Datensätze entfernen, wenn dieses Paar wiederholt wird immerSo entfernen Sie doppelte Datensätze basierend auf einem Wertepaar in Powershell?

Eingabedatei:

abc 1234 class1 
def 1234 class2 
abc 5678 class3 
def 1234 class4 
ghi 1001 class5 

gewünschte Ausgabe ist:

abc 1234 class1 
def 1234 class2 
abc 5678 class3 
ghi 1001 class5 

Dafür ich folgende Skript wrriten haben (Eingabedatei wird mehr haben Spalten):

$inputFile ="D:\powershell\test files\01PRD_MAGI_12_03.txt"; 
$outputFile = "D:\powershell\test files\output.txt" ; 
$stream = [System.IO.StreamWriter]"$outputFile" 


$seenPair = @{} 

$lines = Get-Content $inputFile 
$count = 0 

foreach($line in $lines){ 
    $count = $count + 1 

    #write all header rows and last line as it is in output file 
    if($count -eq 1 -or $count -eq 2 -or $count -eq 3 -or $line.startsWith('*') -or $line.startsWith('-')){ 
     $stream.WriteLine($line); 
    } 
    else{ 
     $ldrCaseNum = $line.Substring(3,7) 
     $cin = $line.Substring(70,9) 

     if($seenPair.Contains($ldrCaseNum)){ 
      $cinVal = $seenPair.Get_Item($ldrCaseNum) 
      if($cin -eq $cinVal){ 
       continue; 
      } 
      else{ 
       $stream.WriteLine($line) 
      } 
     } 
     else{ 
      $seenPair.Add($ldrCaseNum,$cin) 
      $stream.WriteLine($line) 
     } 

    } 
} 

$stream.close() 

Aber in diesem Fall, wenn ein gleiches Paar wiederholt wird, was Wird in der Variablen $ seenPair gespeichert, dann wird dieser Datensatz entfernt. Aber für denselben Schlüssel wird ein anderes Wertepaar wiederholt, dann wird es nicht entfernt, da es bereits einen Wert für diesen Schlüssel enthält.

Beispiel:

abc 1234 class1 
def 1234 class2 
abc 5678 class3 
abc 5678 class3 
def 1234 class4 
ghi 1001 class5 

Ausgang wird sein:

abc 1234 class1 
def 1234 class2 
abc 5678 class3 
abc 5678 class3 
ghi 1001 class5 

Wunsch Ausgabe lautet:

abc 1234 class1 
def 1234 class2 
abc 5678 class3 
ghi 1001 class5 

Gibt es eine andere Lösung?

Antwort

1

Ich werde die Datei als Übung für den Leser in Objekte zerlegen und auf das Entfernen von doppelten Paaren konzentrieren.

# First we have an array of objects 
$Objects = @' 
abc 1234 class1 
def 1234 class2 
abc 5678 class3 
def 1234 class4 
ghi 1001 class5 
'@ |ConvertFrom-Csv -Delimiter " " -Header Case,Cin,Class 

nun alles, was wir brauchen, um Objekte zu entfernen, wo die „Case/Cin“ Kombination bereits existiert Sort-Object -Unique:

PS C:\> $Objects |Sort-Object -Property Case,Cin -Unique 
case cin class 
---- --- ----- 
abc 1234 class1 
abc 5678 class3 
def 1234 class4 
ghi 1001 class5 
+0

, wenn ich Ihren zweiten Befehl ausführen, werden die Daten als Kopf kommenden = "", header = "", ... innerhalb von csv in jeder Zeile. Warum ist es so? – Madhusudan

+0

in welchem ​​csv? Ich gebe nicht nach csv –

+0

aus Ich las den Inhalt von $ Objects | Sort-Object -Property Case, Cin -Unique diese commant in einer Variablen $ Daten und ich schreibe es in eine Datei .. – Madhusudan

Verwandte Themen