2016-04-12 11 views
0

Okuma yaptığım bir PowerShell komut dosyası yazdım (CSV'nin gerekli olmaması şartıyla). Bu iki sütun, vaka numarası ve cin numarası var. Bu çifti tekrarlanan oluyor eğer tüm kayıtları kaldırmak istiyorPowershell'deki değerler çiftine göre yinelenen kayıtları nasıl kaldırılır?

Girdi Dosya:

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

İstenilen Çıktı geçerli: komut aşağıdaki Ben wrriten gelmiş Bunun için

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

(Girdi dosyası daha olacak sütunlar):

$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() 

Fakat bu durumda, eğer aynı çift tekrarlanırsa $ seenPair değişkeninde saklanır, daha sonra bu kayıt silinir. Fakat aynı anahtar için farklı değer çiftleri tekrarlanacak, daha sonra bu anahtar için bir değer taşıdığı için onu kaldırmayacaktır.

Örnek:

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

çıkışı olacaktır:

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

İstenilen çıktı şöyledir: Bunun için herhangi bir başka çözüm

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

var mı?

cevap

1

Dosyayı okuyucunun bir alıştırması olarak nesnelere ayrıştırmaya gidiyorum ve çiftleri çıkarmaya odaklanacağım.

# 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 

Şimdi, hepimiz "Vaka/Cin" kombinasyonu zaten var olduğu nesneleri kaldırmak için gereken Sort-Object -Unique geçerli:

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

Ben senin 2 komutunu çalıştırın, veri başlığı olarak geliyor = "", başlık = "", .... her satırdaki csv içinde. Bu neden böyle? İçinde – Madhusudan

+0

hangi csv? Ben csv –

+0

çıktısını alıyorum $ Objects | Sort-Object -Property Case, Cin -Unique içeriğini bir veri değişkeni içinde okuduğumu ve bir dosyaya yazıyorum. – Madhusudan