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

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 🙂

  • Całkowity czas: 00:00:00.2308620
  • Całkowity czas: 00:00:00.2129062
  • Całkowity czas: 00:00:00.2629116

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

Mateusz Nadobnik

Z pasją poświęcam czas na zdobywanie wiedzy w zakresie szeroko rozumianej Data Platform. Zachwycony językiem skryptowym Windows PowerShell. Swoją wiedzę, doświadczenia i spostrzeżenia opisuję na blogu.

read more

4 komentarze

  • Reply

    Kacper

    Lipiec 2, 2012 at 3:11 pm

    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.

  • Reply

    admin

    Lipiec 2, 2012 at 8:48 pm

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

  • Reply

    Kacper

    Lipiec 3, 2012 at 7:14 am

    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
    }
    }

  • Reply

    AL|EN

    Październik 22, 2013 at 10:47 pm

    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 :-]

This site uses Akismet to reduce spam. Learn how your comment data is processed.