整周发疯,无法解决这个问题。我有一个字典单词文件,一次将有几百万个单词,现在让我们假设它只是一个文本文件“ Words.txt”,其具有:
应用程序 的苹果 应用程序 栏 蝙蝠 连击 帽 资本 糖果
我需要做的是将每个字符串与文件的其余部分进行匹配,并且仅写入第一个匹配项的输出。这将是字母顺序的。
例如,上述单词的期望输出为:
应用-由于首先显示模式“ App”而跳过“ Apple”和“应用 栏”-由于模式“ Bar”,唯一的 蝙蝠-由于模式“ Bat”首先显示而跳过“击球员” 帽-由于模式首先出现“帽子”,而跳过“首都” 糖果-由于图案“糖果”的独特性
我绝对不能弄清楚该怎么做,就是如何忽略最初击中后发生的匹配并转为“新”模式。如果其他冗余模式被覆盖或被跳过,则没关系,这没关系。
我有一个匹配模式的脚本,但我不知道如何以所需的输出结束:(有帮助吗?!?!
$Words = "C:\Words.txt"
[System.Collections.ArrayList]$WordList = Get-Content $Words
$Words
$Words2 = $Words
$i = 0
$r = 0
Foreach ($item in $Words)
{
foreach ($item2 in $Words2)
{
if ($item2 -like "$item*")
{
write-host $("Match " + [string]$i + " " + $item + " " + [string]$r + " " + $item2)
}
$r++
}
$i++
}
一行一行地处理并将它们与最新的唯一前缀进行比较就足够了:
$prefix = '' # initialize the prefix pattern
foreach ($line in [IO.File]::ReadLines('C:\Words.txt')) {
if ($line -like $prefix) { continue } # same prefix, skip
$line # output new unique prefix
$prefix = "$line*" # save new prefix pattern
}
注意:由于您提到输入文件很大,因此,我使用System.IO.File.ReadLines
而不是Get-Content
读取文件是为了获得卓越的性能。
注意:无论如何,示例输入路径都是完整路径,但是请确保始终将完整路径传递给.NET方法,因为.NET的工作目录通常不同于PowerShell的工作目录。
如果包装foreach
循环& { ... }
,则可以以流方式(逐行,而不先收集所有结果在内存中)将结果传递给Set-Content
。
但是,使用.NET类型进行保存也会有更好的效果-请参见此答案的底部。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句