Jeśli do przetworzenia jest dużo danych tekstowych i trzeba je np przefiltrować (coś w stylu polecenia grep). W takim przypadku przetwarzanie pliku przez Import-CSV albo Get-Content może być nieoptymalne, wolelibyśmy przetwarzać plik linia po linijce i … z pomocą mogą przyjść metody .NET
Poniższy przykład pochodzi z Reading And Writing To Files · Powerstart to Powershell reference book (dewin.me)
1 2 3 4 5 6 7 8 9 |
<span class="hljs-variable">$path</span> = <span class="hljs-string">"c:\d\myfile.txt"</span> <span class="hljs-variable">$stream</span> = [System.IO.StreamReader]::new(<span class="hljs-variable">$path</span>) <span class="hljs-keyword">while</span>( <span class="hljs-nomarkup">-not</span> <span class="hljs-variable">$stream</span>.EndOfStream) { <span class="hljs-variable">$value</span> = [int](<span class="hljs-variable">$stream</span>.ReadLine()) <span class="hljs-keyword">if</span> ((<span class="hljs-variable">$value</span>%<span class="hljs-number">10000</span>) <span class="hljs-nomarkup">-eq</span> <span class="hljs-number">0</span>) { <span class="hljs-built_in">write-host</span> <span class="hljs-variable">$value</span> } } <span class="hljs-variable">$stream</span>.close() |
Korzystając z klasy System.IO.StreamReader otwieramy plik, następnie przetwarzamy go aż do osiągnięcia końca pliku (while not end of stream) i przy każdym wykonaniu pobieramy jedną linijkę tekstu przez ReadLine(). Jeśli trzeba by było pobierać więcej danych w każdym kroku – można to zmienić.
Plik jest fizycznie odczytywany linia po linii z dysku, więc użycie pamięci przez program będzie zoptymalizowane.