Excel Forum - Porady, Pomoc,  Excel Help, Excel FAQ Strona Główna
 FAQ  RegulaminRegulamin  Szukaj   Użytkownicy   Grupy   Rejestracja   Profil   Twoje wiadomości   Zaloguj 


Poprzedni temat «» Następny temat
ID tematu: 68510 Skopiuj do schowka Wyciaganie PKD z wyr.regularnych gdzie znajdedużo przykładów
Autor Wiadomość
Auditorius 
Starszy Forumowicz


Wersja: Win Office 2013
Posty: 57
Wysłany: 14-07-2020, 09:19   Wyciaganie PKD z wyr.regularnych gdzie znajdedużo przykładów

Dzień Dobry,

Zaczynam swoją przygodę z wyrażeniami regularnymi. Tematyka przewija się dość często - ja mam 2 kwestie:


1) Mam do wyciągnięcia kody PKD i działalności kontrahentów
Niby proste ale mam je zapisane w bardzo różny sposób

Same kody PKD zaczynają się od
PKD 01.11.Z a kończą na PKD 99.00.Z przy czym zamiast "Z" mogą być dowolne inne literki

Sposób zapisu w moich danych 1
XXX KRS aaa, REGON bbb, NIP ccc ... PKD. Brak danych odnośnie PKD.
Tu potrzebuje "Brak danych odnośnie PKD"

Sposób zapisu 2
xxx SPÓŁKA JAWNA to firma, której branża została w Polskiej Klasyfikacji Działalności (PKD) sklasyfikowana jako: Usługi transportowe. ...
Tu potrzebuje "której branża została w Polskiej Klasyfikacji Działalności (PKD) sklasyfikowana jako: Usługi transportowe. "


Sposób zapisu 3
....Naprawa i konserwacja maszyn (PKD 33.12.Z)
Tu potrzebuje (PKD 33.12.Z)

Moje myślenie
.Pattern = "(PKD[_][0-9][0-9].[0-9][0-9].[a-z]"
ale chyba coś przekombinowałem

Sposób 4
Forma prawna, Spółka z ograniczoną odpowiedzialnością ... Polskiej Klasyfikacji Działalności (PKD) sklasyfikowana jako: Produkcja pozostałych części i ...
Tu potrzebuje "Polskiej Klasyfikacji Działalności (PKD) sklasyfikowana jako: Produkcja pozostałych części i ... "
[niestety trzy kropki występują i PRZED wyrażeniem którego szukam i na końcu]

Sposób 5
NIP: xxx, Marek yy 'Mikro-xxx' - dane firmy i pobieranie odpisu KRS ... Naprawa i konserwacja komputerów i urządzeń peryferyjnych (PKD 95.11.
Tu potrzebuje
[dane zaczynają się od 3 kropek]
Naprawa i konserwacja komputerów i urządzeń peryferyjnych (PKD 95.11.
BEZ NAWIASU I BEZ PEŁNEGO NR PKD BO TAK SIĘ KOŃCZY WYNIK ODPYTANIA WUJKA GOOGLE ale po opisie dojdę jakie jest pełne PKD

Sposób 6
Profil firmy xxx DAMIAN yyy na ALEO.com. Sprawdź jej adres i ... DAMIAN aaa. NIP: yyy ... Wszystkie kody PKD.
Tu potrzebuje "Wszystkie kody PKD" [ŻEBY BYŁO JASNE ŻE TYCH KODÓW W DANYCH NIE MA]


Sposob 7
NIP: xxx, Bartosz eeeProdukcja i Dystrybucja Filmów - dane ... z produkcją filmów, nagrań wideo i programów telewizyjnych (PKD 59.11.Z) Produkcja elektrycznego sprzętu gospodarstwa domowego (PKD 27.51.Z).
Tu potrzebuje wszystkie kody PKD które występują w danych w komórce [czyli jak są 2 to 2 jak są 4 to 4 kody PKD]




2) Czy gdzieś (jakaś strona www, coś innego )są w 1 miejscu zgromadzone jakieś przykłady ale w większej liczbie typu

a) jak wyciągać numerki i nazwy z adresów
Np. Wątek
http://www.excelforum.pl/...Fenia+regularne


b)jak wyciągać tekst który zaczyna się od "stałego" kawałka ale potem ma np. różną długość ale zawsze się kończy np. konkretną
literką, nawiasem, albo fragmentem tekstu ?

Czyli
"Janek coś tam spotkał (broń kaliber X.XX)
"Janek Strzelał do niego i do słonia ale ...(...Mauzer y.yy)
[wielkość liter może być różna]


c) jak wyciągać popularne dane typu nr telefonu komórkowego ale zapisany
raz jako + 48 xxxyyyzzz
dwa jako xxxyyyzzz
trzy jako xxx yyy zzz
cztery jako xxx-yyy-zzz
pięć jako 48xxxyyyzzz

d) jak wyciągnąć nr telefonu stacjonarnego typu
raz jako +48 61 xxx yy zz
dwa jako 61 xxx yy zz
trzy jako xxx-yy-zz

Generalnie chodzi mi o większą liczbę przykładów "Jak to zrobić" dla wyrażeń regularnych
_________________
Nobody's Perfect
ID posta: 389644 Skopiuj do schowka
 
 
Marecki 
Excel Expert



Wersja: Win Office 2019
Pomógł: 2388 razy
Posty: 7815
Wysłany: 15-07-2020, 19:04   

Zacznijmy od funkcji, która może mieć postać np. taką:
Kod:
Function RegEx_Tab(sPattern As String, sStr As String)
    Dim RegEx            As Object
    Dim Matches          As Object
    Dim vTbl()           As Variant
    Dim i                As Long

    On Error GoTo ErrHandl

    Set RegEx = CreateObject("vbscript.regexp")

    With RegEx
        .Global = True      'False = do pierwszego wystąpienia
        .MultiLine = True   '
        .IgnoreCase = True  'True = ignoruje wielkość liter
        .Pattern = sPattern
        Set Matches = .Execute(sStr)
    End With

    ReDim vTbl(1 To Matches.Count, 1 To 1)


    For i = 1 To Matches.Count
        vTbl(i, 1) = Matches(i - 1).submatches(0)
    Next i

    RegEx_Tab = vTbl

    Set RegEx = Nothing
    Set Matches = Nothing

    On Error GoTo 0
    Exit Function

ErrHandl:
    RegEx_Tab = CVErr(xlErrValue)

End Function
Bardzo często ją wykorzystuje.

Auditorius napisał/a:
Same kody PKD zaczynają się od
Generalnie PKD to prosty wzorzec do rozebrania na części pierwsze.
Sam pattern może wyglądać tak:
Cytat:
PKD.?[0-9]{2}\.[0-9]{2}\.[A-Z]{1}
kolorami oddzielone poszczególne bloki.

PKD - to stała tekstowa
.? - dowolny jeden znak (być może w to miejsce wystarczyłoby wstawić spację, ale nie wiem jak by się zachował pattern w przypadku twardej spacji, więc dmucham na zimne.
[0-9]{2} - szukamy cyfr od zera do dziewięciu w ilości szt 2
\. - szukamy kropki
[0-9]{2} - szukamy cyfr od zera do dziewięciu w ilości szt 2
\. - szukamy kropki
[A-Z]{1} - szukamy liter dużych od A do Z, co najmniej jednej.
Proste, prawda ?

Teraz test:
Kod:
Sub Test()
    Dim MyString         As String
    Dim Result           As Variant
    MyString = "Same kody PKD zaczynają się od" & vbCrLf & "PKD 01.121.A a kończą na PKD 99.00.Z przy czym zamiast ""Z"" mogą być dowolne inne literki "
    Result = RegEx_Tab("(PKD.?[0-9]{2}\.[0-9]{2}\.[A-Z]{1})", MyString)

End Sub

Przejdź kod krokowo, zwracając uwagę na to co zawierają poszczególne zmienne.


Sposób 1
Kod:
Sub Sposob_1()
    Dim MyString         As String
    Dim Result           As Variant
    Dim i                As Long

    MyString = "XXX KRS aaa, REGON bbb, NIP ccc ... PKD. Brak danych odnośnie PKD."

    'Domyślna obsługa błędu
    On Error Resume Next
    Result = RegEx_Tab("(Brak danych odnośnie PKD)", MyString)

    If IsError(Result) Then
        Debug.Print "Brak szukanego ciągu."
        Exit Sub
    End If


    For i = 1 To UBound(Result)
        Debug.Print Result(i, 1)
    Next i
End Sub


Sposób 2
Kod:
Sub Sposob_2()
    Dim MyString         As String
    Dim Result           As Variant
    Dim i                As Long

    MyString = "xxx SPÓŁKA JAWNA to firma, której branża została w Polskiej Klasyfikacji Działalności (PKD) sklasyfikowana jako: Usługi transportowe. ... "

    'Domyślna obsługa błędu
    On Error Resume Next
    Result = RegEx_Tab("została w Polskiej Klasyfikacji Działalności \(PKD\) sklasyfikowana jako:(.*?)[.]{1}", MyString)

    If IsError(Result) Then
        Debug.Print "Brak szukanego ciągu."
        Exit Sub
    End If


    For i = 1 To UBound(Result)
        Debug.Print Result(i, 1)
    Next i
End Sub


Sposób 3
Rozwiązanie masz podane w procedurze Test

Sposób 4
Kod:
Sub Sposob_4()
    Dim MyString         As String
    Dim Result           As Variant
    Dim i                As Long

    MyString = "Forma prawna, Spółka z ograniczoną odpowiedzialnością ... Polskiej Klasyfikacji Działalności (PKD) sklasyfikowana jako: Produkcja pozostałych części i ... "

    'Domyślna obsługa błędu
    On Error Resume Next
    Result = RegEx_Tab("[.]{3}(.*?)[.]{3}", MyString)

    If IsError(Result) Then
        Debug.Print "Brak szukanego ciągu."
        Exit Sub
    End If


    For i = 1 To UBound(Result)
        Debug.Print Result(i, 1)
    Next i
End Sub


Sposób 5
Kod:
Sub Sposob_5()
    Dim MyString         As String
    Dim Result           As Variant
    Dim i                As Long

    MyString = "Forma prawna, Spółka z ograniczoną odpowiedzialnością ... Polskiej Klasyfikacji Działalności (PKD) sklasyfikowana jako: Produkcja pozostałych części i ... "

    'Domyślna obsługa błędu
    On Error Resume Next
    Result = RegEx_Tab("([.]{3}(.*?).*)", MyString)

    If IsError(Result) Then
        Debug.Print "Brak szukanego ciągu."
        Exit Sub
    End If


    For i = 1 To UBound(Result)
        Debug.Print Result(i, 1)
    Next i
End Sub


Sposób 6
Przydałby się konkretny przykład

Sposób 7
Patrz procedura Test

Ogólnie do testowania Patternu korzystam z tej stronki:
https://regex101.com/

Co do reszty to po przeanalizowaniu kodów sam znajdziesz rozwiązania, a stron na temat wyrażeń regularnych w internecie masz całą masę.
_________________
Hardware - ta część komputera, którą można kopnąć kiedy software przestanie funkcjonować.

Szkolenia z Excela , FB
Office 2019 Professional Plus , Windows 10 x64
Pozdrawiam, były mkkk23 teraz Marecki.
ID posta: 389706 Skopiuj do schowka
 
 
Auditorius 
Starszy Forumowicz


Wersja: Win Office 2013
Posty: 57
Wysłany: 22-07-2020, 17:11   

WIELKIE dzięki !
_________________
Nobody's Perfect
ID posta: 390040 Skopiuj do schowka
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group
Theme xandgreen created by spleen& Programosy modified v0.3 by warna
Opieka techniczna www.marketingNET.pl

Archiwum

Strona używa plików cookies.

Kliknij tutaj, żeby dowiedzieć się jaki jest cel używania cookies oraz jak zmienić ustawienia cookie w przeglądarce.
Korzystając ze strony użytkownik wyraża zgodę na używanie plików cookies, zgodnie z bieżącymi ustawieniami przeglądarki.
Sprawdź, w jaki sposób przetwarzamy dane osobowe