Arrays Powershell从包含大量字符串的大文本文件中删除任何行
我们有一个大的(~100MB)文本文件。 我们需要删除包含某些短语的任何行。我想用PowerShell来代替当前的方法,它使用windows grep,是一个.bat文件 问题是,大约有95个关键短语。必须删除包含这些短语的任何行 关键短语列表包含在“Arrays Powershell从包含大量字符串的大文本文件中删除任何行,arrays,regex,powershell,data-processing,Arrays,Regex,Powershell,Data Processing,我们有一个大的(~100MB)文本文件。 我们需要删除包含某些短语的任何行。我想用PowerShell来代替当前的方法,它使用windows grep,是一个.bat文件 问题是,大约有95个关键短语。必须删除包含这些短语的任何行 关键短语列表包含在“”badshages.txt“”中,该行像常规文本文件一样分隔。大概有100个,我不想把它们包括在硬编码的列表中,但如果必须的话,我会的 我尝试过几次比较,但我的输出总是比原始输入文件大!或者,0k(空)。我做错了什么?我怀疑问题出在Where O
”badshages.txt“
”中,该行像常规文本文件一样分隔。大概有100个,我不想把它们包括在硬编码的列表中,但如果必须的话,我会的
我尝试过几次比较,但我的输出总是比原始输入文件大!或者,0k(空)。我做错了什么?我怀疑问题出在Where Object
过滤器中,但我可能错了
[string[]]$arrayFromFile = Get-Content -Path '.\badPhrases.txt'
get-content ".\inputfile.txt" | Where-Object {$_ -notlike $arrayFromFile} | Out-File ".\clean_data.txt" -Force
我尝试了-notlike、-notin-notmatch和-notcontains(以似乎合乎逻辑的方式翻转数组和输入对象)。比如
Where-Object {$arrayFromFile -notin $_}
....
Where-Object {$_ -notcontains $arrayFromFile}
....
Where-Object {$_ -notlike arrayFromFile}
我已经搜索了stackOverflow并在谷歌上搜索了一下,但我找不到任何没有死掉的链接,这些链接都是针对这个确切的用例的。有一个“嘿,脚本编写人”的参考,但是。。。链接已失效。使用,它通过传递到其-Pattern
参数的字符串数组支持多个搜索条件:
Select-String -NotMatch -SimpleMatch -Pattern (Get-Content -Path .\badPhrases.txt) .\inputfile.txt |
Select-Object -ExpandProperty Line |
Out-File .\clean_data.txt -Force
字符编码警告:在Windows PowerShell中,默认情况下,Out文件创建“Unicode”(UTF-16LE)文件,其中每个字符由(至少)2个字节表示;在PowerShell[Core]6+中,默认值是更合理的BOM少UTF-8;使用-Encoding
参数显式控制字符编码
-NotMatch
取消匹配,以便只输出与任何模式字符串不匹配的行
-SimpleMatch
确保模式与输入文件的行完全匹配;默认情况下,它们被解释为正则表达式
- 注意,默认情况下,匹配不区分大小写;如果需要,请使用区分大小写的
-code>
- 由于默认情况下,
Select String
输出实例,因此需要Select Object-ExpandProperty Line
来提取行本身
- 注意:在PowerShell 7+中,您可以使用
选择字符串-Raw
开关
至于你所尝试的:
$\u与$arrayFromFile不同
不能将数组用作字符串比较运算符的RHS,例如-like
,-match
,-eq
-一次只能匹配一个字符串
(除此之外,-like
/-notlike
默认情况下与整个LHS匹配;要匹配LHS的子字符串,必须将*
放在RHS的任一端。)
有关更多信息,请参阅
$arrayFromFile-notin$\
$\uU4-notcontains$arrayFromFile
原则上,您必须反转的操作数及其反运算-语法是-contains
和-In
-但问题是,同样,整个字符串的匹配是以任何一种方式执行的,因此这种方法只有在$arrayFromFile
包含输入中的完整行时才有效(-in
和-contains
隐式执行每个元素的-eq
比较).当我这样运行时,我的输出文件仍然比输入文件大!但是:我注意到,而且我忽略了这个细节,一些“坏短语”包含特殊字符;例如大于、小于、逗号、斜杠和反斜杠。你认为我需要转义这些特殊字符吗?或者在“badshages.txt”文件中用引号括起来?@Pink:大小的增加很可能来自Windows PowerShell(但不是PowerShell Core)中创建“Unicode”文件(UTF-16LE)的Out文件-请查看我的更新。不,如果您使用-SimpleMatch
,则无需转义特殊字符。这太棒了,非常感谢。因此,它似乎正常工作;我正在尝试将对象与使用grep并耗时100年的旧.bat文件的输出进行比较。差异需要一些时间。我将输出文件类型更改为utf8,这不是出于兼容性考虑,只是为了快速查看输出是否与另一个方法相近。(是的;这个方法约为69MB,另一个约为71Mb).will mark as response!很高兴听到这个消息很有帮助,@Pink。结果与预期相符吗?请注意,在Windows PowerShell中另存为UTF-8总是在3字节UTF-8 BOM的前面。是的-这似乎工作得很好。事实上,它捕获了几千行我们没有得到的基于“grep”的批处理文件!我永远不会想到使用select字符串和EXPLAND(扩展)功能,非常感谢!我们对文件格式没有我想象的那么担心;这些文件不会返回到它们起源的大型机。