複数のカンマ区切りのテキストファイル(それぞれに100万行以上あります)があります。また、私は "delete.log"と呼ばれる1つのファイルがあります。 delete.logファイルの別のファイルの文字列リストに基づいて複数のテキストファイルの行を削除するにはどうすればよいですか?
構造は、このようなものです:私は、効果的な探しています
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
: name1.txt:
STRING1
STRING2
STRING3
.
.
STRING N
構造多くのtxtファイルの一つのようです方法は、ファイル "delete.log"から各テキスト文字列を読み取る方法と、行5にdelete.logファイルのテキスト文字列と一致するものがある場合は、 行全体が削除されます。 また、STRING1.txtのようにdelete.log のファイル名を持つフォルダにテキストファイルがある場合、ファイルは削除されます。
列5内のテキスト文字列がちょうどGet-Content cmldetを使用してファイルを読み込む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
}
上記のとおりです。私はそれぞれ100万行以上の複数のtxtファイルを持っています。できるだけ速くコードを保存したいと思います。だから私はSystem.IO.StreamReaderとSystem.IO.StreamWriterを使用しています。あなたのソリューションが非常に効果的かどうかはわかりません。 – Steve
私はこのようなコードを私のコードに実装したいと思います。foreach($ System.IO.File :: ReadLines($ filename)){ // $ line}で可能です。 – Steve
大丈夫です。上記のselect-stringを '$ line'で使うことができます –