我编写了一个PowerShell脚本,其中我正在读取文件(不一定是CSV)。在这里我有两列,案例编号和cin编号。我希望删除所有记录,如果这一对重复
输入文件:
abc 1234 class1
def 1234 class2
abc 5678 class3
def 1234 class4
ghi 1001 class5
所需的输出是:
abc 1234 class1
def 1234 class2
abc 5678 class3
ghi 1001 class5
为此,我有以下脚本(输入文件将有更多列):
$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()
但是在这种情况下,如果同一对重复存储在$ seenPair变量中,那么该记录将被删除。但对于相同的密钥,不同的值对将重复,然后它不会删除它,因为它已经为该密钥保留了一个值。
示例:
abc 1234 class1
def 1234 class2
abc 5678 class3
abc 5678 class3
def 1234 class4
ghi 1001 class5
输出将是:
abc 1234 class1
def 1234 class2
abc 5678 class3
abc 5678 class3
ghi 1001 class5
所需的输出是:
abc 1234 class1
def 1234 class2
abc 5678 class3
ghi 1001 class5
还有其他解决办法吗?
答案 0 :(得分:1)
我要将文件解析为对象,作为读者练习,并专注于删除重复对。
# 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
现在,我们只需要删除" Case / Cin"已经存在的组合是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