如果我在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
答案 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
调用,以确保对输入文件进行全面处理,从而允许您在同一管道中写回同一文件。
但是请注意,这会将所有匹配的行立即加载到内存中,并且如果中断写回输入文件的操作,则数据丢失的风险很小-这两个问题都可以通过更大的努力来解决。