Kategorie szkoleń | Egzaminy | Kontakt
  • 4
  • 12
  • 358

Ostatnio na kursie AC04 zostałem poproszony o pomoc w rozwiązaniu problemu dotyczącego odczyszczania tekstu. Tekst ma być odczyszczony z fragmentów ograniczonych określoną parą znaków. Na przykład tekst: Ala (123) ma (12) kota powinien być zamieniony na: Ala ma kota, gdzie oczywiście znakami ograniczającymi tekst do odczyszczenia są nawiasy.

Uczestnik szkolenia
  • Zapytał
  • @ Uczestnik szkolenia | 13.02.2014

Odpowiedzi (4)

  • 14

Rozwiązaniem takiego problemu może być własna funkcja napisana oczywiście w VBA. Kod funkcji należy wkleić do modułu publicznego:

' Wymaga biblioteki Excela
' ze względu na obiekt WorksheetFunction
Function PominTekst( _
     Tekst As String, Ogr1 As String, Ogr2 As String, _
     BezZbednychSpacji As Boolean)
     
     Dim Pocz As Long, Wynik As String
     Dim PozOgr1 As Long
     Dim PozOgr2 As Long
     Pocz = 1
     Do
         PozOgr1 = InStr(Pocz, Tekst, Ogr1)
         If PozOgr1 = 0 Then Exit Do
         PozOgr2 = InStr(PozOgr1 + 1, Tekst, Ogr2)
         Wynik = Wynik & Mid(Tekst, Pocz, PozOgr1 - Pocz)
         Pocz = PozOgr2 + 1
     Loop
     Wynik = Wynik & Mid(Tekst, Pocz)
     If BezZbednychSpacji Then
         PominTekst = WorksheetFunction.Trim(Wynik)
     Else
         PominTekst = Wynik
     End If
End Function
  • Odpowiedział
  • @ | 13.02.2014
  • TRENER ALTKOM AKADEMII
Komentarze
  • 5

Dla formalności wersja PowerShella inspirowana wersją Artura:

PS Env:\> "Ala (123) ma (12) kota" -replace "\([^)]+\)"
Ala  ma  kota

Wyrażenie regularne skonstruowane analogicznie do poprzedniego rozwiązania z drobnymi zmianami w składni m.in.:

- nawiasy okrągłe zostały potraktowane dosłownie przez dodanie znaku "\"
- usunięte zostały opcje

Przy okazji nasuwa się jeszcze jedno usprawnienie - usuwanie zbędnych spacji:

PS Env:\> "Ala (123) ma (12) kota" -replace "\([^)]+\)\s+"
Ala ma kota

 

  • Odpowiedział
  • @ | 14.05.2014
  • TRENER ALTKOM AKADEMII
Komentarze
Wow, Windows goni Linuksa :P
Skomentował : @ TRENER ALTKOM AKADEMII ,14.05.2014
Czerpie z dobrych wzorców i chociaż trudno szukać natywnych (pomijam gnuwin32 czy cygwiny) odpowiedników takich narzędzi jak sed czy awk to z bash'em PowerShell ma wiele cech wspólnych. W kwestii podejścia obiektowego do shella to Linuks musi dogonić Windowsa ;)
Skomentował : @ TRENER ALTKOM AKADEMII ,15.05.2014
  • 12

To ja jeszcze zaproponuję rozwiązanie dla osoby, która nie chce mieszać w takie sprawy programowania i zaproponuję wykonanie tego zadania zwykłą kwerendą.

Przyjmiemy następujące dane do oczyszczenia z fragmentu zawartego w nawiasach:

 

I stworzymy kwerendę, która wytnie znaki od strony lewej do "(" i połączy to z fragmentem tekstu wyciętym od strony prawej od ")".

Nazwa_konw: Trim(Left([Nazwa_kl];InStr(1;[nazwa_kl];"(")-1) & Right([nazwa_kl];Len([nazwa_kl])-InStr(1;[nazwa_kl];")")))


Gdzie [Nazwa_kl]  - top nazwa pola w którym wycinamy dane:

 


I efekt tego wycinania:

 

 

W rozwiązaniu dodatkowo umieściłem funkcję TRIM, która to potencjalnie zajmie się niepotrzebnymi spacjami.

Pozdrawiam.
Tomasz Grabowski.

  • Odpowiedział
  • @ | 22.05.2014
  • TRENER MODERATOR ALTKOM AKADEMII
  • 10

Nie taka znowu zwykła ta kwerenda. ;) Ciekawe, czy przy pomocy wyrażeń regularnych można jeszcze pozbyć się zbędnych spacji... :)

  • Odpowiedział
  • @ | 22.05.2014
  • TRENER ALTKOM AKADEMII