Zine.net online

Witaj na Zine.net online Zaloguj się | Rejestracja | Pomoc
w Szukaj

arkadiusz.wasniewski

(K)Cultura w PowerShell

“Bo kultura tu naprawdę jest, świadczy o tym nasz wspaniały Dom Kultury” śpiewał w 1988 roku w Jarocinie zespół “Zielone Żabki”. Ktoś pamięta? Dziś też będzie o kulturze, ale przez literę c czyli o Culture. Tekst zaś dotyczył będzie tak prozaicznej kwestii jak polskie znaki narodowe.

Zacznijmy od początku. Utwórzmy, np. w Notatniku, plik w formacie CSV zawierający nazwy ptaków z polskimi znakami narodowymi:

	id,nazwa
	1,Gżegżółka
	2,Żuraw
	3,Łabędź

I spróbujmy go wczytać korzystając ze standardowego polecenia PowerShell:

    Import-Csv 'c:\ptaki.csv'

Jak sie można domyśleć (wstęp to sugerował) to, co ujrzą nasze oczy nie będzie ładne. Zamiast polskich znaków będą mniej lub bardziej nieokreślone śmieci (zależy gdzie uruchomimy nasz kod) zgodne z UTF8. Skąd wiemy, że z UTF8? Empirycznie będzie można to sprawdzić za chwil kilka.

Wstępnie problem został więc rozwiązany. Jak natomiast zmusić PowerShell do wczytania pliku CSV zgodnie z polską stroną kodową? Okazuje się, iż najłatwiej jest skorzystać z polecenia Get-Content, które domyślnie bierze pod uwagę ustawienia regionalne systemu operacyjnego komputera.

    Get-Content 'c:\ptaki.csv' | ConvertFrom-Csv

Dzięki zaś poleceniu ConvertFrom-Csv oraz skorzystania z potoku możemy cieszyć się poprawnością wyświetlania:

	id	nazwa                                         
	--	-----                                         
	1	Gżegżółka                                     
	2	Żuraw                                         
	3	Łabędź                                        

Polecenie Get-Content posiada również, co ciekawe, parametr Encoding, który pozwala ustawić kilka możliwych stron kodowych. Nie są to powalające ilości, ale zawsze coś. W przypadku ustawienia kodowania na UTF8 otrzymamy dane w postaci identycznej jak w przypadku polecenia Import-Csv. Aby natomiast uzyskać efekt identyczny jak w przypadku wywołania tego polecenia bez strony kodowej należy parametr Encoding ustawić na wartość String.

    Get-Content 'c:\ptaki.csv' -Encoding String | ConvertFrom-Csv

Co zaś w przypadku kiedy możliwości lingwistyczne standardowych poleceń PowerShell nas nie usatysfakcjonują? Zawsze możemy skorzystać z metod klas platformy .NET:

    [System.IO.File]::ReadAllText(
        'c:\ptaki.csv', 
        [System.Text.Encoding]::GetEncoding(1250)) | ConvertFrom-Csv

I na koniec inny, niż skorzystanie z Notatnika, wariant tworzenia plików CSV:

    Set-Content 'c:\ptaki.csv' 'id,nazwa'
    Add-Content 'c:\ptaki.csv' '1,Gżegżółka'
    Add-Content 'c:\ptaki.csv' '2,Żuraw'
    Add-Content 'c:\ptaki.csv' '3,Łabędź'

Oczywiście w tych poleceniach również możemy skorzystać z parametru Encoding.

Opublikowane 18 grudnia 2009 23:19 przez arkadiusz.wasniewski
Filed under: ,

Komentarze:

 

dotnetomaniak.pl said:

Dziękujemy za publikację - Trackback z dotnetomaniak.pl

grudnia 19, 2009 07:05
Komentarze anonimowe wyłączone
W oparciu o Community Server (Personal Edition), Telligent Systems