
Neulich musste ich recht lange Textdateien verarbeiten und griff dabei zur StreamReader-Klasse. Dabei musste ich feststellen, dass die oft zitierte Methode
$sread = [System.IO.StreamReader]::new($file) while ($line = $sread.ReadLine()) { #Operationen... }
vorzeitig abbricht, wenn eine komplett leere Zeile (also nur aus CR+LF auf Windows bzw. LF auf UNIX/Linux bestehend) angetroffen wird. Dann gibt es $null zurück, und die Schleife ist zu Ende.
Die offiziell dokumentierte Methode, das „richtig“ zu machen, ist Peek:
$sread = [System.IO.StreamReader]::new($file) while ($sread.Peek() -gt -1) { $line = $sread.ReadLine() #Operationen... }
Man kann aber auch die EndOfStream-Eigenschaft bemühen:
$sread = [System.IO.StreamReader]::new($file) while ($sread.EndOfStream -eq $false) { $line = $sread.ReadLine() #Operationen... }
Performance-technisch gaben sich beide Methoden in meinen Tests nichts.
Happy streamreading!
Antworten