Powershell脚本需要根据定义的列表对行中分隔符之间的项进行密文处理



您好,感谢您的阅读。这是我的第一篇帖子,真的需要一些帮助。最难的部分是让人们理解我的问题。我会尽力的。

我有一些巨大的csv文件(有些超过800万行,所以Excel实际上不是一个选项(,我需要根据参考文件中定义的单词集修改每行中第三个"字段"的内容

因此,csv示例可能类似于:

AB12|TEST|CAT DOG MOUSE|TEST1|TEST2|TEST3||TEST4
CD34|TEST|HORSE CART TRAIN|TEST1|TEST2|TEST3||TEST4

等等

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

CAT
HORSE CART

这些包含在CSV 中

我需要的是修改文件,以便将第三个"字段"(第二个"|"之后和第三个"|"之前的所有内容(与参考列表进行比较并进行修改以匹配。即在第一行中,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 "~DesktopTest*.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 ""

总之:这实际上是一个经过修改的"查找和替换文本"功能,它专注于每行中的一个字段,寻找匹配的单词集,然后删除该字段中除匹配单词之外的所有内容,匹配单词在单独的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

最新更新