2016-05-26 5 views
1

Ich habe mehrere durch Trennzeichen getrennte Textdateien (jede hat über 1 Million Zeilen). Außerdem habe ich eine Datei namens "delete.log".Wie lösche Zeilen von mehreren Textdateien basierend auf String-Liste aus einer anderen Datei?

Struktur der delete.log Datei ist wie folgt:

STRING1 
STRING2 
STRING3 
. 
. 
STRING N 

Struktur eine von vielen txt-Dateien ist wie folgt: 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     

Ich bin für eine effektive Suche So können Sie jede Textzeichenfolge aus der Datei "delete.log" lesen, und wenn in der Zeile 5 eine Übereinstimmung mit der Textzeichenfolge aus der Datei delete.log vorhanden ist, wird die gesamte Zeile gelöscht. Wenn sich eine Textdatei in einem Ordner mit dem Dateinamen delete.log wie STRING1.txt befindet, wird die Datei gelöscht.

Dieser Code unten nur ganze Reihe von mehreren Textdateien löschen, wenn Textzeichenfolge in Spalte 5 ist 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 
} 

Antwort

0

einfach die Dateien lesen Sie die Get-Content cmldet, verwenden Sie die Select-String Cmdlets die Einträge zu filtern und schließlich schreiben die Einträge mit zurück Set-Content:

$deleteLog = Get-Content 'delete.log' 
$name1 = Get-Content 'name1.txt' 

$name1 | Select-String -NotMatch $deleteLog | Set-Content 'name1.txt' 

Inhalt von name1.txt jetzt:

text1,text2,text3,text4,text5    
text1,text2,text3,text4,text5 
+0

Wie ich oben erwähnt habe. Ich habe mehrere TXT-Dateien mit jeweils über 1 Million Zeilen. Ich möchte meinen Code so schnell wie möglich behalten. Deshalb verwende ich System.IO.StreamReader und System.IO.StreamWriter. Ich bin mir nicht sicher, ob Ihre Lösung sehr effektiv wäre. – Steve

+0

Ich würde gerne so etwas in meinen Code implementieren: foreach ($ -Zeile in [System.IO.File] :: ReadLines ($ filename)) { // mach etwas mit $ line } Wenn es möglich ist. – Steve

+0

okay. Sie können die Auswahlzeichenfolge oben in Ihrer $ line verwenden –

Verwandte Themen