Szövegfájlok beolvasása (Get-Content)

Szöveges fájlok olvasására a Get-Content  cmdlet szolgál, amint azt már korábban is láthattuk. Paraméterként egy, vagy több fájl nevét kell megadnunk, a kimenetbe pedig a fájlok tartalma kerül soronként egy-egy karakterlánc képében:

PS C:\> $soronként = Get-Content C:\Windows\debug\mrt.log

PS C:\> $soronként[3]

Started On Wed Aug 12 21:29:48 2015

A fenti példában egy log fájlt olvastam be, a negyedik elemét külön megvizsgáltam, ami a fájl egy sora.

Tehát a beolvasás soronként történik alaphelyzetben, így egy sok sorból álló fájl beolvasása sok I/O műveletet igényel, ami lassúvá teszi a művelete. Akkor lehet ez előnyös, ha csővezetékben dolgozzuk fel a sorokat, és a sorok tartalmától függően esetleg nem az összes sort akarjuk beolvasni, így fölösleges sorokat nem kell beolvasnunk.

A másik véglet, hogy beolvassuk az egész fájlt egyben. Ez I/O szempontjából gyors, viszont nagyon nagy fájl esetében sok memóriát fogyaszthat. A két véglet között választhatunk valami köztes értéket a -ReadCount paramétert használatával:

PS C:\> $tízsoronként = Get-Content C:\Windows\debug\mrt.log -ReadCount 10

PS C:\> $tízsoronként[3]

 

Engine: 1.1.11903.0

Signatures: 1.203.693.0

Microsoft Windows Malicious Software Removal Tool Finished On Sat Aug 15 08:01

:42 2015

 

 

Return code: 0 (0x0)

 

------------------------------------------------------------------------------

---------

Microsoft Windows Malicious Software Removal Tool v5.27, August 2015 (build 5.

27.11700.0)

A fenti példában 10 soronkénti olvasást választottam, ugyanazt a 4. elemet kiolvasva azonban más eredményt kapunk. Mi történt? Ilyenkor, ha nem soronként olvassuk a fájlt, akkor az eredménytömb elemei nem 1-1 sorok lesznek, hanem annyi sorok, amennyit beolvastunk:

PS C:\> $tízsoronként[3].count

10

A korábban kiolvasott igazi 4. sort tehát kettős indexszel érhetjük el:

PS C:\> $tízsoronként[0][3]

Started On Wed Aug 12 21:29:48 2015

A másik végletet választásához a -ReadCount értékét 0-ra kell választanunk. Ekkor tehát beolvassuk az összes sort egyben és ilyenkor is egy „sima” tömböt kapunk:

PS C:\> $összes = Get-Content C:\Windows\debug\mrt.log -ReadCount 0

PS C:\> $összes[3]

Started On Wed Aug 12 21:29:48 2015

Azaz akármelyik változatot választjuk, akkor valamilyen tömböt kapunk eredményként, ha semmit vagy 0-t választjuk a -ReadCount értékének, akkor egy-egy sor a tömb eleme, ha egyéb érték a ReadCount, akkor pedig a tömb elemei szintén tömbök lesznek, és ott lesznek a soraink.

Mindez akkor okoz problémát, ha például a teljes szövegben akarunk valamilyen szót, kifejezést keresni, vagy kicserélni. Ilyenkor vagy valamilyen ciklust kell írjunk, vagy külön össze kell fűzzük a sorokat, majd az eredményre kell elvégeznünk a műveletet.

PowerShell 3.0-tól kezdődően van egy újabb lehetőségünk, a -Raw kapcsoló használatával. Ezzel egy nagy string-et kapunk, nem sok sort:

PS C:\> $egyben = Get-Content C:\Windows\debug\mrt.log -Raw

PS C:\> $egyben.GetType().fullname

System.String

Ha a -Raw kapcsolót használom együtt a -ReadCount-al, akkor az eredmény egy egyelemű tömb lesz, melynek ez az 1 eleme lesz a teljes szöveg:

PS C:\> $egyben = Get-Content C:\Windows\debug\mrt.log -ReadCount 10 -Raw

PS C:\> $egyben.GetType().fullname

System.Object[]

PS C:\> $egyben.Count

1

PS C:\> $egyben[0].GetType().fullname

System.String

Ha nincs szükség a fájl teljes tartalmára, akkor a -TotalCount paraméterrel behatárolhatjuk, hogy hány sort olvassunk be:

PS C:\> $kevés = Get-Content C:\Windows\debug\mrt.log -TotalCount 10

PS C:\> $kevés.Count

10

Szövegfájlokat többféleképpen lehet kódolni. PowerShellben az alaphelyzet szerinti kódolás az unicode. Ha más kódolással van tárolva egy fájl, akkor az -Encoding paraméterrel kiválaszthatjuk a helyeset. A lehetőségek a következők:

PS C:\> [Microsoft.PowerShell.Commands.FileSystemCmdletProviderEncoding].GetEnu

mNames()

Unknown

String

Unicode

Byte

BigEndianUnicode

UTF8

UTF7

UTF32

Ascii

Default

Oem

BigEndianUTF32



Word To HTML Converter