Powershell 脚本需要根据定义的列表编辑行中分隔符之间的项目

Powershell Script needed to redact items in between separators in a row according to defined list

您好,感谢阅读。这是我的第一个 post,真的需要一些帮助。最困难的部分是以人们能够理解的方式表达我的问题。我会努力的。

我有一些巨大的 csv 文件(有些超过 800 万行,所以 Excel 真的不是一个选项)我需要根据以下内容修改每行中第 3 个 'field' 的内容参考文件中定义的词组

所以示例 csv 可能类似于:

AB12|TEST|CAT DOG MOUSE|TEST1|TEST2|TEST3||TEST4

CD34|TEST|HORSE CART TRAIN|TEST1|TEST2|TEST3||TEST4

等等等等

在我的参考文件中有一个列表,例如:

CAT

HORSE CART

这些包含在 CSV 文件中

我需要修改文件,以便将第 3 个 'field'(第 2 个“|”之后和第 3 个“|”之前的所有内容)与参考列表进行比较并修改以匹配。即第一行,CAT 之后的所有内容都将被删除,第二行,HORSE CART 之后的所有内容都将在第三个字段中删除。因此输出的结果文件如下所示:

AB12|TEST|CAT|TEST1|TEST2|TEST3||TEST4

CD34|TEST|HORSE CART|TEST1|TEST2|TEST3||TEST4

我通常使用 F.A.R.T 修改大文件,但这需要比 FART 能够提供的更聪明。

我真的希望这对外面的人有意义,感谢您提供的任何帮助。

到目前为止,我一直在试验这个,但距离做我想做的还有很长的路要走:

cls

$content = ""

write-output "** Original String **"
write-output ""

$content = Get-Content "~\Desktop\Test\*.dat" 

$content

$separator1 = " " 
$separator2 = "|" 

$parts = $content.split($separator1)

write-output ""
write-output "** Revised String **"
write-output ""

$part1 = echo $parts[0]
$part3 = $part2.split($separator2)

$part4 = $part3[1]

$revised = $part1, $part4 -join "|"



$revised

write-output ""

所以总结一下:这实际上是一个修改后的 'Find and Replace Text' 函数,它专注于每一行中的一个字段,查找匹配的单词集,然后删除该字段中除匹配单词之外的所有内容,它们在单独的 csv 文件中定义。

好的,因为在 PowerShell 中比较数组不支持通配符,我们必须以老式(昂贵)的方式进行。将每个字段与每个参考进行比较。

我没有提供读取文件的示例,因为在速度或内存消耗(您的选择)方面可以通过不同的方式完成。

此外,我将引用作为数组而不是作为文件输入提供,以使示例切题(并且易于测试)。

然后输出当然应该完成到一个新文件而不是写入主机。

$file = @"
F1|F2|F3|F4|F5|F6|F7|F8
AB12|TEST|CAT DOG MOUSE|TEST1|TEST2|TEST3||TEST4
CD34|TEST|HORSE CART TRAIN|TEST1|TEST2|TEST3||TEST4
CD34|TEST|HORSE CART|TEST1|TEST2|TEST3||TEST4
"@

$ref = @("CAT*","HORSE CART*")


$file.split("`n") | foreach {# line in file
    $outline = $nul
    $_.split('|') | foreach {# field in the line
        $field = $_
        $refhit = $false
        $ref | foreach {# item in the ref array
            if ($field -like $_) {# replace field with ref
                $refhit = $true
                $outline += $_.TrimEnd('*') + '|'
            }# end match
            
        }# end ref

        if (!$refhit){#pass on the field as is
            $outline += "$field|" 
        }
        
    }#end field

    # Output filtered line
    write-host $outline.TrimEnd('|')

}#end line