我有一个像这样的csv文件:
num1;num2;num3;num4;num5
1;2;3;4;5
5;6;7;8;9
1;2;;4;5
2;3;4;5;6
Num1是主要的参数,我可以看到它有一个重复的字符串(第一和第三个字符串)。我想删除重复的字符串3(1; 2 ;; 4; 5)因为它在num3列中有$ null。如何使用PowerShell执行此操作?
答案 0 :(得分:0)
Import-CSV "C:\temp\test.csv" -Delimiter ";" |
Where-Object{$_.Num3} |
Sort-Object -Unique Num1 |
Export-Csv "C:\temp\test1.csv" -Delimiter ";" -NoTypeInformation
这将获取文件并将其作为自定义对象导入。然后,删除Num3
为空/未填充的任何条目。我们使用Sort-Object
删除并复制Num1
有警告这样做;不知道如何确定哪个条目是重复的,排序可能会影响输出。这也会引用输出,这不应该是一件坏事。
此代码对您的数据集也是多余的,因为Where
和Sort
会删除相同的行。如果数据包含只包含其中一个条件(dup或null)的行,则此代码将过滤它们。
好的,所以上面的代码毫不奇怪地删除了你没想到的额外数据。最有可能的是,因为条件是单独评估的,就像你想要的OR一样,这就是你正在寻找的。我更改了您的测试数据以解释这些差异以证明解决方案。
此解决方案在重复时重建数据集检查。如果找到Num1
的副本,我们会检查该记录的Num3
是否为null或空。
测试数据
num1 num2 num3 num4 num5
---- ---- ---- ---- ----
1 2 3 4 5
5 6 8 9
1 2 4 5
1 2 7 4 5
2 3 4 5 6
因此,我们可以看到Num1
= 5,Num3
为空,且Num1
= 1且Num3
= 7。这些不应过滤掉他们不满足这两个要求。
$scrubbed = @()
$data = import-csv C:\temp\test.csv -Delimiter ";"
$data | ForEach-Object{
If($scrubbed.Num1 -contains $_.Num1){
# We already have this Num1 check to see if it is null
If($_.Num3){
# Num3 is populated so it can be added.
$scrubbed += $_
}
} Else {
# This Num1 is unique and should be added.
$scrubbed += $_
}
}
# Output to file
$scrubbed | Export-Csv "C:\temp\test1.csv" -Delimiter ";" -NoTypeInformation
应该如下所示将输出作为分号分隔文件写回。
num1 num2 num3 num4 num5
---- ---- ---- ---- ----
1 2 3 4 5
5 6 8 9
1 2 7 4 5
2 3 4 5 6