2016-05-26 16 views
1

複数のカンマ区切りのテキストファイル(それぞれに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 
} 

答えて

0

ある場合だけで、複数のテキストファイルから行全体を削除し、以下のこのコードは、エントリをフィルタし、最終的に書くことSelect-Stringコマンドレットを使用しますエントリはバック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 
+0

上記のとおりです。私はそれぞれ100万行以上の複数のtxtファイルを持っています。できるだけ速くコードを保存したいと思います。だから私はSystem.IO.StreamReaderとSystem.IO.StreamWriterを使用しています。あなたのソリューションが非常に効果的かどうかはわかりません。 – Steve

+0

私はこのようなコードを私のコードに実装したいと思います。foreach($ System.IO.File :: ReadLines($ filename)){ // $ line}で可能です。 – Steve

+0

大丈夫です。上記のselect-stringを '$ line'で使うことができます –

関連する問題