我有多个逗号分隔的文本文件(每个文件有超过100万行)。我还有一个名为“delete.log”的文件。
delete.log文件的结构如下:
STRING1
STRING2
STRING3
.
.
STRING N
构建许多txt文件之一是这样的: name1.txt:
text1,text2,text3,text4,STRING1 "entire row will be deleted"
text1,text2,text3,text4,STRING1 "entire row will be deleted"
text1,text2,text3,text4,text5
text1,text2,text3,text4,STRING2 "entire row will be deleted"
text1,text2,text3,text4,STRING1 "entire row will be deleted"
text1,text2,text3,text4,text5
我正在寻找一种有效的方法如何从文件“delete.log”中读取每个文本字符串,如果第5行中的匹配项与来自delete.log文件的文本字符串匹配, 整行将被删除。 此外,如果文件夹中的文本文件具有delete.log中的文件名 像STRING1.txt一样,文件将被删除。
如果第5列中的文本字符串为STRING1
,则下面的代码只删除多个文本文件中的整行$paths = Get-ChildItem '.\' -Filter '*.txt'
ForEach ($path in $paths) {
$pathtmp = "$path.tmp"
$sr = New-Object -TypeName System.IO.StreamReader -ArgumentList $path
$sw = New-Object -TypeName System.IO.StreamWriter -ArgumentList $pathtmp
Do {
$line = $sr.ReadLine()
$Column = $line.split(",")
If ($Column[4] -ne "STRING1") {
$sw.WriteLine($line)
}
} Until ( $sr.EndOfStream )
$sr.close()
$sw.close()
Remove-Item $path
Rename-Item $pathtmp $path
}
答案 0 :(得分:0)
只需使用Get-Content cmldet读取文件,使用Select-String cmdlet过滤条目,最后使用Set-Content写回条目:
$deleteLog = Get-Content 'delete.log'
$name1 = Get-Content 'name1.txt'
$name1 | Select-String -NotMatch $deleteLog | Set-Content 'name1.txt'
现在name1.txt
的内容:
text1,text2,text3,text4,text5
text1,text2,text3,text4,text5