Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Powershell从包含大量字符串的大文本文件中删除任何行_Arrays_Regex_Powershell_Data Processing - Fatal编程技术网

Arrays Powershell从包含大量字符串的大文本文件中删除任何行

Arrays Powershell从包含大量字符串的大文本文件中删除任何行,arrays,regex,powershell,data-processing,Arrays,Regex,Powershell,Data Processing,我们有一个大的(~100MB)文本文件。 我们需要删除包含某些短语的任何行。我想用PowerShell来代替当前的方法,它使用windows grep,是一个.bat文件 问题是,大约有95个关键短语。必须删除包含这些短语的任何行 关键短语列表包含在“”badshages.txt“”中,该行像常规文本文件一样分隔。大概有100个,我不想把它们包括在硬编码的列表中,但如果必须的话,我会的 我尝试过几次比较,但我的输出总是比原始输入文件大!或者,0k(空)。我做错了什么?我怀疑问题出在Where O

我们有一个大的(~100MB)文本文件。 我们需要删除包含某些短语的任何行。我想用PowerShell来代替当前的方法,它使用windows grep,是一个.bat文件

问题是,大约有95个关键短语。必须删除包含这些短语的任何行

关键短语列表包含在“
”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(扩展)功能,非常感谢!我们对文件格式没有我想象的那么担心;这些文件不会返回到它们起源的大型机。