Sortörés kezelése szövegfájlokban

Gyakran előfordulnak olyan szöveges fájlok, amelyekben az információblokkok nem korlátozódnak egy-egy sorra, hanem átnyúlnak sorvégeken. Ez speciális odafigyelést és feldolgozási módot igényel, hiszen – ahogy láttuk – például a get-content is soronként dolgozza fel a szöveges állományokat.

Példaként nézzünk egy olyan szöveges állományt, amelyet maga a PowerShell hoz létre a start-transcript  cmdlet segítségével:

[33] PS C:\> Start-Transcript C:\powershell2\scripts\transforregex.txt

Transcript started, output file is C:\powershell2\scripts\transforregex.txt

[34] PS C:\> "Ez egy rövid sor"

Ez egy rövid sor

[35] PS C:\> "Ez egy hosszú sor igazi sortörés nélkül, viszont átnyúlik két

sorba"

Ez egy hosszú sor igazi sortörés nélkül, viszont átnyúlik két sorba

[36] PS C:\> "Ez egy kétsoros

>> szöveg"

>> 

Ez egy kétsoros

szöveg

[37] PS C:\> Stop-Transcript

Transcript stopped, output file is C:\powershell2\scripts\transforregex.txt

A fenti példában indított transcript tartalmaz mindenféle hosszúságú sort, mesterségesen nyitott új sort alprompttal. Az elkészült fájl a következőképpen néz ki Notepaddal nézve:

104 . ábra Transcript fájl

Láthatjuk, hogy csak ott tett a fájlba sortörést, ahol tényleg Entert ütöttünk. Olvassuk be ezt a fájlt:

[41] PS C:\> $text = get-content C:\powershell2\scripts\transforregex.txt

Az így kapott $text változó egy sztringtömböt eredményez, amelynek egyes elemei a fájl sorai:

[42] PS C:\> $text[8]

Ez egy rövid sor

Hogy lehetne ebből egy olyan sztringet készíteni, amely tartalmazza az összes sort? Egyik lehetőség, hogy a –join operátorral összefűzzük a szöveget a soremelés karaktereinek beiktatásával:

[43] PS C:\> $text = $text -join "`r`n"

Hogy az eredeti információtartalmat megőrizzük, én egy „kocsivissza-újsor” kombinációval fűztem össze a szövegem darabjait, merthogy a Windowsban ez a „hivatalos” sortörés.

Másik lehetőség az, hogy eleve a beolvasást más módszerrel végezzük, szintén a .NET keretrendszer segítségével, a File objektumtípus ReadAllText statikus metódusának segítségével:

[44] PS C:\> $text2 = [System.IO.File]::ReadAllText("c:\powershell2\scripts\

transforregex.txt")

Ha legalább PowerShell 3.0-nk van, akkor harmadik lehetőségként használhatjuk a beolvasásnál a –Raw paramétert:

PS C:\> Get-Content -Path 'C:\PSKönyv\Szöveggel.txt'

Első sor

Második sor

PS C:\> (Get-Content -Path 'C:\PSKönyv\Szöveggel.txt') -is [string]

False

PS C:\> (Get-Content -Path 'C:\PSKönyv\Szöveggel.txt' -raw) -is [string]

True

Látható a fenti példában, hogy ha „simán” olvassuk be a szöveget, akkor kételemű tömböt kapunk, nem pedig sztringet, míg ha használjuk a –Raw kapcsolót, akkor egy többsoros szöveget kapunk eredményül.

Akármelyik módszert is választjuk, ugyanolyan eredményt kapunk, így immár egyszerűbben tudunk akár soron átnyúló regex kifejezéssel keresni.

Nézzük azt is, hogyan tudunk sortöréssel és sortörés nélkül szövegfájlokat létrehozni? A PowerShell a szövegfájlokat nem csak soronként olvassa, hanem így is írja. Nézzünk erre egy példát:

[1] PS C:\> "első sor" | Out-File c:\ee\szöveg.txt

[2] PS C:\> "második sor" | Out-File c:\ee\szöveg.txt -Append

[3] PS C:\> Get-Content C:\ee\szöveg.txt

első sor

második sor

Az első sorban létrehoztam egy szövegfájlt egy sorral, majd a második sorban ehhez hozzáírtam, az Out-File  cmdletet használtam az –append kapcsolóval. Látható a visszaolvasott szövegben ez a hozzáfűzés egy sortörés beiktatásával történt.

Néha szükség lehet sortörés nélküli hozzáírásra is. Ehhez a .NET keretrendszer [System.IO.File]  osztályának AppendAllText metódusát használhatjuk:

[18] PS C:\> [IO.File]::AppendAllText("C:\ee\szöveg.txt","közvetlen hozzáfűzés"

,[text.encoding]::unicode)

[19] PS C:\> Get-Content C:\ee\szöveg.txt

első sor

második sor

közvetlen hozzáfűzés

[20] PS C:\> [IO.File]::AppendAllText("C:\ee\szöveg.txt","közvetlen hozzáfűzés2

",[text.encoding]::unicode)

[21] PS C:\> Get-Content C:\ee\szöveg.txt

első sor

második sor

közvetlen hozzáfűzésközvetlen hozzáfűzés2

Vigyázzunk, mert ennek nem lesz első alkalommal még hatása! Mint ahogy a [18]-[19]-es sorokban láthatjuk, az így hozzáírt szöveg még nem sorfolytonos. Ennek pontos okát nem tudom, hiszen az Out-File nem helyez automatikusan sortörést a fájl végére, de mégis az AppendAllText első alkalommal sortöréssel illeszt, viszont a második alkalommal már sorfolytonos lett a hozzáfűzés.



Word To HTML Converter