Sposób na usuwanie polskich znaków – PowerShell

By PowerShell

Potrzebowałem skryptu który będzie usuwać wszystkie polskie znaki z danego ciągu, po dłuższej chwili… stworzyłem coś takiego:

$Polish = ą, ć, ę, ł, ń, ó, ś, ż, ź, Ą, Ć, Ę, Ł, Ń, Ó, Ś, Ż, Ź
$English = a, c, e, l, n, o, s, z, z, A, C, E, L, N, O, S, Z, Z

$ciag = (Chrząszcz brzmi w trzcinie w Szczebrzeszynie, W szczękach chrząszcza trzeszczy miąższ, 
Czcza szczypawka czka w Szczecinie, Chrząszcza szczudłem przechrzcił wąż, 
Strząsa skrzydła z dżdżu, A trzmiel w puszczy, tuż przy Pszczynie, Straszny wszczyna szum...)
foreach($litera in $ciag.toCharArray())
{
    for($i=0; $i -lt 19; $i++)
    {
        if($litera.ToString().Equals($Polish[$i]))
        {
         $ciag=$ciag.Replace($Polish[$i],$English[$i])
        }
    }
} $ciag

Zastanawiam się czy idzie to napisać prościej, lepiej? Jakieś pomysły, propozycje?

Na pozbycie się polskich znaków jest prostszy w zapisie  i przede wszystkich szybszy sposób. Liczby mówią wszystko, tak na szybko porównanie mojego skryptu z skryptem napisanym w komentarzu przez Kacpra za co wielkie dzięki 🙂

function Remove-DiactricChars1{
[CmdletBinding()]
param(
[Parameter(ValueFromPipeline=$true)]
[string]$ciag
)
begin
    {
    $Polish = ą, ć, ę, ł, ń, ó, ś, ż, ź, Ą, Ć, Ę, Ł, Ń, Ó, Ś, Ż, Ź
    $English = a, c, e, l, n, o, s, z, z, A, C, E, L, N, O, S, Z, Z
    $Elapsed = [System.Diagnostics.Stopwatch]::StartNew()
    }
process
{
    foreach($litera in $ciag.toCharArray())
    {
        for($i=0; $i -lt 19; $i++)
        {
            if($litera.ToString().Equals($Polish[$i]))
            {
             $ciag=$ciag.Replace($Polish[$i],$English[$i])
            }
        }
    }
}
end
    {
    $ciag
    Write-Host ?Calkowity czas: $($Elapsed.Elapsed.ToString())?
    }
}
Trzy próby dały wynik:
  • Całkowity czas: 00:00:00.2308620
  • Całkowity czas: 00:00:00.2129062
  • Całkowity czas: 00:00:00.2629116
function Remove-DiactricChars{
[CmdletBinding()]
param(
[Parameter(ValueFromPipeline=$true)]
[string]$text
)
begin
    {
    $Elapsed = [System.Diagnostics.Stopwatch]::StartNew()
    $chars = @{?ą?=?a?;?ć?=?c?;?ę?=?e?;?ł?=?l?;?ń?=?n?;?ó?=?o?;?ś?=?s?;?ż?=?z?;?ź?=?z?}
    }
process
    {
    $chars.GetEnumerator() | ForEach-Object{
    $text = $text -replace $_.Key, $_.Value}
    }
end
    {
    $text
    Write-Host ?Calkowity czas: $($Elapsed.Elapsed.ToString())?
    }
}

Również trzy próby:

  • Całkowity czas: 00:00:00.0312814
  • Całkowity czas: 00:00:00.0367986
  • Całkowity czas: 00:00:00.0326167
22 Najważniejsze Wskazówki Pisania Skryptów PowerShell

4 Responses to " Sposób na usuwanie polskich znaków – PowerShell "

  1. Kacper pisze:

    Nie wiem czy będzie lepiej, ale mi osobiście taka forma wydaje się przystępniejsza:

    function Remove-DiactricChars{
    [CmdletBinding()]
    param(
    [Parameter(ValueFromPipeline=$true)]
    [string]$text
    )

    begin{
    $chars = @{
    “ą”=”a”;
    “ć”=”c”;
    “ę”=”e”;
    “ł”=”l”;
    “ń”=”n”;
    “ó”=”o”;
    “ś”=”s”;
    “ż”=”z”;
    “ź”=”z”
    }
    }

    process{
    $chars.GetEnumerator() | ForEach-Object{
    $text = $text -replace $_.Key, $_.Value
    }
    }
    end{
    $text
    }
    }

    Tylko jeszcze muszę wykombinować jak sobie poradzić z wielkimi literami, bo użycie ą i Ą w kończy się błędem – Duplicate keys ‘Ą’ are not allowed in hash literals. Można by było użyć 2 tablic teoretycznie ale jakoś nie podoba mi się to rozwiązanie. Chyba będzie jednak najprostsze niestety.

  2. admin pisze:

    Dzięki bardzo:) Na pewno wykorzystam Twój skrypt bo okazał się prostszy i znacznie szybszy.

  3. Kacper pisze:

    Cieszę się, że mogłem pomóc. 🙂 Przy okazji rozwiązałem też problem wielkich liter. Skrypt jest trochę dłuższy, ale zmiany dotyczą głównie sposobu utworzenia tablicy znaków.

    function Remove-DiactricChars{
    [CmdletBinding()]
    param(
    [Parameter(ValueFromPipeline=$true)]
    [string]$text
    )

    begin{
    $chars = New-Object System.Collections.Hashtable ([System.Stringcomparer]::CurrentCulture)
    $chars.Add(“ą”,”a”)
    $chars.Add(“ć”,”c”)
    $chars.Add(“ę”,”e”)
    $chars.Add(“ł”,”l”)
    $chars.Add(“ń”,”n”)
    $chars.Add(“ó”,”o”)
    $chars.Add(“ś”,”s”)
    $chars.Add(“ż”,”z”)
    $chars.Add(“ź”,”z”)
    $chars.Add(“Ą”,”A”)
    $chars.Add(“Ć”,”C”)
    $chars.Add(“Ę”,”E”)
    $chars.Add(“Ł”,”L”)
    $chars.Add(“Ń”,”N”)
    $chars.Add(“Ó”,”O”)
    $chars.Add(“Ś”,”S”)
    $chars.Add(“Ż”,”Z”)
    $chars.Add(“Ź”,”Z”)
    }

    process{
    $chars.GetEnumerator() | ForEach-Object{
    $text = $text -creplace $_.Key, $_.Value
    }
    }
    end{
    $text
    }
    }

  4. AL|EN pisze:

    A może tak panowie:

    $ciag = “Chrząszcz brzmi w trzcinie w Szczebrzeszynie, W szczękach chrząszcza trzeszczy miąższ,
    Czcza szczypawka czka w Szczecinie, Chrząszcza szczudłem przechrzcił wąż,
    Strząsa skrzydła z dżdżu, Ą trzmiel w puszczy, tuż przy Pszczynie, Straszny wszczyna szum…”

    function Remove-DiactricChars ( [string]$text ) {
    $Elapsed = [System.Diagnostics.Stopwatch]::StartNew()
    $text`
    -replace( ?ą?,?a? )`
    -replace( ?ć?,?c? )`
    -replace( ?ę?,?e” )`
    -replace( “ł?,?l” )`
    -replace( “ń?,?n” )`
    -replace( “ó?,?o” )`
    -replace( “ś?,?s” )`
    -replace( “ż?,?z” )`
    -replace( “ź?,?z? )`
    -replace( “Ą”,”A” )`
    -replace( “Ć”,”C” )`
    -replace( “Ę”,”E” )`
    -replace( “Ł”,”L” )`
    -replace( “Ń”,”N” )`
    -replace( “Ó”,”O” )`
    -replace( “Ś”,”S” )`
    -replace( “Ż”,”Z” )`
    -replace( “Ź”,”Z” )
    Write-Host ?Calkowity czas: $( $Elapsed.Elapsed.ToString() )?
    }

    Remove-DiactricChars $ciag

    Prościej, czytelniej i szybciej :-]

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.

× Close