Egyéni objektumok létrehozása CSV adatokból (ConvertFrom-CSV)

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.



Word To HTML Converter