如果在CSV列中找到术语,则删除行

时间:2019-03-21 19:03:11

标签: powershell

如果我在CSV表中找到某种电子邮件地址,则需要从表中删除一行。有多个电子邮件字段,但是我只想对一个电子邮件列执行此操作,而不是我认为下面的代码当前可以执行的操作。

我该如何指定?

$data = foreach ($line in Get-Content D:\Data\info.csv) {
    if ($line -Like '*@LS*' -or $line -Like '*@gmail*') {
    } else {
        $line
    }
}
$data | Set-Content D:\Data\info.csv -Force

2 个答案:

答案 0 :(得分:2)

使用Where-Object过滤器:

$file = 'D:\Data\info.csv'
(Get-Content $file) | Where-Object {
    $_ -notlike '*@LS*' -and $_ -notlike '*@gmail*'
} | Set-Content $file

如果要检查特定字段而不是整个行,请使用Import-Csv / Export-Csv而不是Get-Content / Set-Content

$file = 'D:\Data\info.csv'
(Import-Csv $file) | Where-Object {
    $_.FOO -notlike '*@LS*' -and $_.FOO -notlike '*@gmail*'
} | Export-Csv $file -NoType

用实际的字段名称替换FOO

除了通配符匹配,您还可以使用字符串操作:

-not $_.FOO.Contains('@LS') -and -not $_.FOO.Contains('@gmail')

或单个正则表达式:

$_.FOO -notmatch '@(LS|gmail)'

答案 1 :(得分:0)

补充Ansgar Wiechers' helpful answer

Select-String允许简洁的解决方案(PSv3 +语法)具有全线匹配-如Ansgar所建议的那样,使用distanceChange并将匹配限制在感兴趣的领域是最好:

Import-Csv

请注意(Select-String -NotMatch '@LS', '@gmail' D:\Data\info.csv).Line | Set-Content D:\Data\info.csv -Force 中如何包含Select-String调用,以确保对输入文件进行全面处理,从而允许您在同一管道中写回同一文件。
但是请注意,这会将所有匹配的行立即加载到内存中,并且如果中断写回输入文件的操作,则数据丢失的风险很小-这两个问题都可以通过更大的努力来解决。