使用powershell删除csv中的重复字符串

时间:2015-01-27 12:34:55

标签: powershell

我有一个像这样的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执行此操作?

1 个答案:

答案 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

警告这样做;不知道如何确定哪个条目是重复的,排序可能会影响输出。这也会引用输出,这不应该是一件坏事。

此代码对您的数据集也是多余的,因为WhereSort会删除相同的行。如果数据包含只包含其中一个条件(dup或null)的行,则此代码将过滤它们。

不同的方法

好的,所以上面的代码毫不奇怪地删除了你没想到的额外数据。最有可能的是,因为条件是单独评估的,就像你想要的OR一样,这就是你正在寻找的。我更改了您的测试数据以解释这些差异以证明解决方案。

此解决方案在重复时重建数据集检查。如果找到Num1的副本,我们会检查该记录的Num3是否为null或空。

csv文件中的

测试数据

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