Gyakran előfordul, hogy teljesen egyedi adataink vannak, amelyek még csak nem is hasonlítanak a PowerShell, de még csak a .NET által használt típusokhoz sem, viszont ha tudnánk belőlük speciális típusú objektumokat létrehozni, akkor fel tudjuk használni kezelésükre a számos PowerShell cmdletet. Nézzünk például egy egyszerű futóverseny eredménylistáját, az lenne a feladat, hogy állapítsuk meg az első három helyezettet. Legyen a kiinduló adatunk egy CSV formátumú fájlban:
[76] PS C:\> Get-Content C:\munka\futók.txt
Név, Idő
Béla, 5:12
Dezső, 5:37
Karcsi, 5:36
Marci, 5:49
Tódor, 5:25
Tibi, 4:45
Gabi, 5:18
Andris, 4:52
Bence, 4:48
Nem csalás, nem ámítás, ez tényleg egy csv formátumú fájl. Ez soronként egy-egy sztring, ebből szövegként kibányászni az idő paramétert elég nehéz lehet. Szerencsére erre nincs szükség, mert van nekünk egy ConvertFrom-Csv cmdletünk, ami pont az átalakítást elvégzi:
[77] PS C:\> Get-Content C:\munka\futók.txt | ConvertFrom-Csv
Név Idő
--- ---
Béla 5:12
Dezső 5:37
Karcsi 5:36
Marci 5:49
Tódor 5:25
Tibi 4:45
Gabi 5:18
Andris 4:52
Bence 4:48
Itt már láthatjuk, hogy strukturálttá vált az adathalmazunk, ezt már a korábban látott PowerShell cmdletekkel fel lehet dolgozni:
[78] PS C:\> Get-Content C:\munka\futók.txt | ConvertFrom-Csv | Sort-Objec
t -Property idő | Select-Object -First 3
Név Idő
--- ---
Tibi 4:45
Bence 4:48
Andris 4:52
Egy picit csaltam, hiszen az idő azért nem igazi időformátum:
[79] PS C:\> (Get-Content C:\munka\futók.txt | ConvertFrom-Csv)[1].idő.get
type()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
Ha teljesen precíz akarok lenni, akkor érdemes változóba tölteni az eredményeket és akkor lehetőségünk van adattranszformációt végezni:
[83] PS C:\> $futók = Get-Content C:\munka\futók.txt | ConvertFrom-Csv
[84] PS C:\> $futók | ForEach-Object { $_.idő = [timespan] $_.idő}
[85] PS C:\> $futók
Név Idő
--- ---
Béla 05:12:00
Dezső 05:37:00
Karcsi 05:36:00
Marci 05:49:00
Tódor 05:25:00
Tibi 04:45:00
Gabi 05:18:00
Andris 04:52:00
Bence 04:48:00
[86] PS C:\> $futók[0].idő.gettype().fullname
System.TimeSpan
Itt már tényleg idő típusú a futók időeredménye, de itt most ez a sorba rendezésben nem játszott szerepet.