Strona 1 z 1

Wyszukanie częściowych danych - wyrażenia regularne

: wt lut 07, 2017 5:40 pm
autor: iwcia2305
Witam,

Proszę o pomoc w wyrażeniach regularnych.
Posiadam zbiór danych z których chciałabym wyszukać dane.

Przykład.
Jako kryterium wyszukiwania mam komórkę f2 w której znajdują się dane - 1234.
W macierzy posiadam dane typu AA/1234asde.
Próbowałam opcję łączenia "..."+"f2"+".*" ale nie wyszukuje mi informacji.

Proszę o wskazówki jak mogłabym rozwiązać ten problem.

Re: Wyszukanie częściowych danych - wyrażenia regularne

: wt lut 07, 2017 11:02 pm
autor: Jan_J
Zamiast operatora dodawania + do łączenia tekstów używaj &
Cudzysłowy ograniczają stałe tekstowe. Tak więc 12 to zapis liczby, "12" to tekst z dwóch cyfr. F2 to adres komórki, "F2" to napis.
Wzorzec "..." & F2 & ".*" będzie dopasowany m.in. do "AA/1234asde".

Re: Wyszukanie częściowych danych - wyrażenia regularne

: wt lut 07, 2017 11:34 pm
autor: Jermor
Sądzę, że autorka powinna wyjaśnić o jakie wyszukiwanie chodzi?
1. Funkcja SZUKAJ.TEKST
2. Operacja Edycja - Znajdź i zamień
3. Dane - Więcej filtrów -Filtr zaawansowany
4. filtrowanie w tabeli przestawnej.
Poniżej przykład wyszukiwania za pomocą 3.
szukaj.jpg
Wybierając dodatkowo "Kopiuj wynik do" można otrzymać ekstrakt z danych.

Re: Wyszukanie częściowych danych - wyrażenia regularne

: śr lut 08, 2017 2:32 pm
autor: iwcia2305
Dokładnie chodzi mi o funkcje wyszukaj pionowo

Próbowałam poprawić formułę za radą poprzez &&

=WYSZUKAJ.PIONOWO("..."&F2&".*";E11:F11;2;0)
Niestety pokazuje mi wynik #N/D

Re: Wyszukanie częściowych danych - wyrażenia regularne

: śr lut 08, 2017 6:26 pm
autor: Jan_J
iwcia2305 pisze:=WYSZUKAJ.PIONOWO("..."&F2&".*";E11:F11;2;0)
Niestety pokazuje mi wynik #N/D
Formuła jest poprawna. Jedyną komórką która tą formułą jest przeszukiwana jest E11. Być może nie ma tam tekstu pasującego do wzorca. O tym zresztą mówi kod #N/D.

Możliwe też, że trzeba skonfigurować Calca:
Narzędzia/Opcje/Calc/Oblicz/ [x] używaj wyrażeń regularnych w formułach (albo podobnie).

Re: Wyszukanie częściowych danych - wyrażenia regularne

: śr lut 08, 2017 7:12 pm
autor: Jermor
Jan ma rację #N/D (not data?) oznacza, że nie ma takiej wartości. Prawie na pewno nie jest zaznaczona opcja "Włącz wyrażenia regularne w formułach".
Wielu forumowiczów nie poprawia wpisów informujących jakiego programu i jakiej wersji używają. Nie chce mi się wierzyć, że ciągle używasz 3.1.
Apache OpenOffice to teraz 4.1.3 a Libre Office to 5.2.5
W tym ostatnim są dwie opcje: "Włącz symbole wieloznaczne w formułach" i alternatywna "Włącz wyrażenia regularne w formułach".
W Twoim przypadku należałoby zaznaczyć tę drugą.

Re: Wyszukanie częściowych danych - wyrażenia regularne

: śr lut 08, 2017 7:15 pm
autor: iwcia2305
Funkcję używania wyrażeń regularnych mam włączoną a dane znajdują się w macierzy.

W jednym z artykułów (http://librehelp.pl/wyszukaj-pionowo) znalazłam informację, iż przy stosowaniu wyrażeń regularnych w funkcji wyszukiwania nie zawsze wynik może pokazać się prawidłowy.

Re: Wyszukanie częściowych danych - wyrażenia regularne

: czw lut 09, 2017 1:52 pm
autor: Jan_J
Trochę nie rozumiem załączonego przykładu. Nie ma tam formuły z funkcją wyszukaj.pionowo wg wyrażeń regularnych. Załączam malutki test pokazujący jak to powinno działać.
Sprawdzałem na Calc z Libre 5.2.5.1 Portable w systemie Windows 7 32-bit.

Re: Wyszukanie częściowych danych - wyrażenia regularne

: czw lut 09, 2017 2:12 pm
autor: Jermor
Co do pokazywania nieprawidłowych wyników, to mam duże wątpliwości do tego stwierdzenia. WYSZUKAJ.PIONOWO ma cztery argumenty. Czwarty bardzo często jest pomijany, ale wówczas oznacza, że przyjmuje wartość PRAWDA (1). Oznacza to, że tablica przeszukiwania jest posortowana narastająco wg pierwszej kolumny. Podanie wartości FAŁSZ (0) oznacza, że tablica nie jest posortowana. Funkcja w zależności od tego argumentu może zwracać różne odpowiedzi.
Przy argumencie równym 0, będzie to pierwszy pasujący ciąg, przy równym 1 zależy od zinterpretowania kolejności. Jednak zawsze #N/D oznacza, że nie ma ciągu pasującego do wyrażenia regularnego.
Załączony przez Ciebie plik jest kompletnie niezrozumiały dla kogoś z zewnątrz. Nie napisałaś gdzie pojawia się to #N/D.
Ale przyjrzałem się wyrażeniu:

Kod: Zaznacz cały

=JEŻELI(CZY.BRAK(WYSZUKAJ.PIONOWO(G2;Zlecenia.$B$2:$C$8;2;0));"";(WYSZUKAJ.PIONOWO(G2;Zlecenia.$B$2:$C$8;2;0)))
jeżeli używasz LibreOffice to prościej zapiszesz to tak:

Kod: Zaznacz cały

=JEŻELI.BŁĄD(WYSZUKAJ.PIONOWO(G2;Zlecenia.$B$2:$C$8;2;0);"")
Co do #N/D jeśli się nie mylę chodzi o wartość 0162 widoczną w F2. To jest powód nieporozumienia? To co widzisz w F2 to wynik formatowania liczby z czterema cyframi wiodącymi. Zatem liczba 162 jaką tam wpisano jest przedstawiona jako 0162. Twoje wyrażenie żąda aby wystąpiły trzy dowolne znaki i ciąg z tej komórki, a to oznacza, że po tych znakach jest liczba 162 a nie 0162. Czwartym znakiem w przeglądanej macierzy jest 0 a funkcja wyszukująca chce jedynki na tym miejscu.
Zastąp te trzy kropki np ciągiem ".*" albo w F2 wpisz tekstowo wartość 0162. Żeby nie bawić się w apostrofy stawiane przed liczbą, przypisz komórce format Tekst.

Re: Wyszukanie częściowych danych - wyrażenia regularne

: czw lut 09, 2017 11:47 pm
autor: iwcia2305
Bardzo dziękuję wszystkim za pomoc. Problem udało mi się rozwiąząć.

Re: Wyszukanie częściowych danych - wyrażenia regularne

: wt cze 18, 2019 4:46 pm
autor: michal.s
Dzień dobry.
Podłączę się do wątku i zastanawiam się nad tym co wpisać w kodzie

Kod: Zaznacz cały

 =WYSZUKAJ.PIONOWO("..." & D10 & ".*";$A$2:$B$6;2;0) 
żeby po wpisaniu w komórkę D10 'JD' żeby otrzymać wynik 'p' a nie #N/D
Przechwytywanie.JPG

Re: Wyszukanie częściowych danych - wyrażenia regularne

: wt cze 18, 2019 7:58 pm
autor: Jermor
Z ilustracji wynika, że kody są pierwszymi znakami w przeglądanych ciągach. Jeżeli tak to wystarczy formuła:

Kod: Zaznacz cały

=WYSZUKAJ.PIONOWO(D10&".*";A2:B6;2;0)
gdy ciąg może wystąpić gdzieś wewnątrz tekstu formulę należy zmodyfikować następująco:

Kod: Zaznacz cały

=WYSZUKAJ.PIONOWO(".*"&D10&".*";A2:B6;2;0)
  1. Należy upewnić się, że zaznaczoną opcją w ustawieniach dla Calca (Narzędzia -> Opcje -> LibreOffice Calc -> Oblicz" jest "Włącz wyrażenia regularne w formułach" a nie "Włącz symbole wieloznaczne w formułach".
  2. Znaleziony zostanie zawsze pierwszy zgodny kod i to dla niego zostanie zwrócona odpowiedź.
  3. Jeśli poszukiwanego kodu nie ma w żadnym ciągu odpowiedzią jest #N/D

Re: Wyszukanie częściowych danych - wyrażenia regularne

: wt cze 18, 2019 8:11 pm
autor: Jermor
Jeszcze krótka uwaga. WYSZUKAJ.PIONOWO nie rozróżnia wielkości liter.
W zastosowanej przez ciebie formule pierwsze trzy kropki "..." oznaczają że najpierw muszą wystąpić trzy dowolne znaki a dopiero po nich to co jest wpisane do D10. Kropka w wyrażeniach regularnych oznacza jeden dowolny znak. Symbol gwiazdki oznacza, że znak występujący przed gwiazdką może nie wystąpić w ogóle albo dowolna ilość razy. Zatem zapis w rodzaju ".*"&D10 oznacza, że szukana zawartość z D10 może rozpoczynać przeszukiwany ciąg lub może być poprzedzona dowolną liczbą dowolnych znaków.

Re: Wyszukanie częściowych danych - wyrażenia regularne

: czw cze 27, 2019 2:12 pm
autor: michal.s
Dziękuję Jermor za bardzo pomocną radę.
Wszystko zadziałało bardzo dobrze :-)
Mam jeszcze do Ciebie jedno pytanie. Jak powinien wyglądać zapisać kodu

Kod: Zaznacz cały

=WYSZUKAJ.PIONOWO(".*"&D10&".*";A2:B6;2;0)
żeby uwzględnić nie zawartość komórki tylko tekst 'JD'

Re: Wyszukanie częściowych danych - wyrażenia regularne

: czw cze 27, 2019 2:34 pm
autor: Jermor

Kod: Zaznacz cały

=WYSZUKAJ.PIONOWO(".*JD.*";A2:B6;2;0)
a jeżeli każdy kod rozpoczyna się od ciągu literowego, i tylko na początku ciągu mogą pojawić się litery JD, to wystarczy:

Kod: Zaznacz cały

=WYSZUKAJ.PIONOWO("JD.*";A2:B6;2;0)

Re: Wyszukanie częściowych danych - wyrażenia regularne

: czw cze 27, 2019 2:59 pm
autor: michal.s
Dziękuję Jermor za szybką odpowiedź :-)
Zastanawiam się i próbuję przeanalizować ten przykład i nie do końca potrafię zrozumieć kwestię zapisu

Kod: Zaznacz cały

".*JD.*"
Spełnia on swoją rolę przy funkcji WYSZUKAJ PIONOWO, nie spełnia jej natomiast przy funkcji JEŻELI

Kod: Zaznacz cały

=JEŻELI(A9=".*JD.*";"p";"nie p")
Przechwytywanie.gif

Re: Wyszukanie częściowych danych - wyrażenia regularne

: czw cze 27, 2019 6:05 pm
autor: Jermor
Zapis ".*JD.*" oznacza, że szukany ciąg może zaczynać się od liter JD lub te litery mogą być poprzedzone dowolną liczbą innych znaków a po literach JD może nie wystąpić nic albo jakieś dowolne znaki. Sekwencję ".*" należy interpretować następująco: ma wystąpić 0 lub więcej znaków znajdujących się przed gwiazdką. Gwiazdka nie jest w tym przypadku znakiem wyszukiwanym lecz symbolem wyrażenia regularnego. Przed gwiazdką znajduje się kropka, która także nie jest znakiem wyszukiwanym lecz symbolem regularnym oznaczającym jakiś dowolny znak. Gdy chcemy w tekście wyszukać znak, który należy do symboli regularnych, należy go poprzedzić symbolem "\"
Wyrażenia regularne są bardzo pomocne jednak nie mogą być wykorzystywane we wszystkich funkcjach. Należy do nich także funkcja JEŻELI. Opisy funkcji zawierają informację o tym czy można użyć wyrażeń regularnych. Brak takiej informacji w opisie funkcji oznacza, że wyrażenia regularne są niedopuszczalne.
Chcesz utworzyć formułę na poziomie wiersza zawierającą wpis "p" lub "nie p". Użyj do tego funkcji SZUKAJ.TEKST, która pozwala skorzystać z wyrażenia regularnego. Funkcja zwraca numer znaku w przeglądanym ciągu, na którym rozpoczyna się szukany tekst. Funkcja nie rozróżnia wielkości liter. Gdy tekst nie wystąpi zwracany jest błąd #VALUE!. Dlatego skorzystaj z takiej formuły:

Kod: Zaznacz cały

=JEŻELI(CZY.BŁĄD(SZUKAJ.TEKST(".*JD.*";A9;1));"nie p";"p")
SZUKAJ.TEKST szuka podanego ciągu. Jeśli go znajdzie jej wynikiem jest liczba (numer znaku), jeśli nie - wynikiem jest błąd.
CZY.BŁĄD zwraca wartość PRAWDA, gdy funkcja SZUKAJ.TEKST zwróciła błąd a FAŁSZ - gdy ciąg został znaleziony.
JEŻELI wykonuje działanie zależne od tego jaki jest wynik CZY.BŁĄD

Re: Wyszukanie częściowych danych - wyrażenia regularne

: czw cze 27, 2019 10:23 pm
autor: Jermor
Tak się zafiksowałem na wyrażenia regularne, że bezsensownie napisałem formułę. Wystarczy taka:

Kod: Zaznacz cały

=JEŻELI(CZY.BŁĄD(SZUKAJ.TEKST("JD";A9;1));"nie p";"p")
SZUKAJ.TEKST wyszukuje potrzebny ciąg tekstowy w innym ciągu tekstowym. Ponieważ szukamy konkretnie dwóch sąsiadujących liter "JD" to dla tej funkcji wyrażenie regularne nie jest konieczne.
Byłoby potrzebne gdyby np. szukanym ciągiem miał być "JD" i 6 dowolnych cyfr występujących po tych literach albo te litery miały występować jako czwarty i piąty znak badanego ciągu.

Re: Wyszukanie częściowych danych - wyrażenia regularne

: pt cze 28, 2019 4:25 pm
autor: michal.s
Teraz wszystko jest JASNE :-)

Bardzo Dziękuję Jermor za POMOC... a w szczególności Bardzo Dziękuję za Cierpliwość i Wyrozumiałość.
Poruszane kwestie są niby oczywiste, ale... no własnie :-) oczywiste, klarowne i zrozumiałe są dla osób, które zajmują się tematem na co dzień.
W moim przypadku na co dzień korzystam z arkuszy i formuł, które udało mi się napisać za pośrednictwem forum oraz osób, które służą tutaj swoim czasem i pomocą.

Jeszcze raz dziękuję Tobie oraz Wszystkim z forum :-)