Funkcja wyodrębnij fragmenty ciągu.

Gotowe szablony, skrypty, makropolecenia i rozszerzenia. Tutaj możesz pochwalić i podzielić się swoją twórczością z innymi użytkownikami

Funkcja wyodrębnij fragmenty ciągu.

Postprzez Jermor » Wt lip 16, 2019 4:33 pm

W dziale Calc na forum pojawiła się prośba o rozwiązanie problemu wyodrębnienia z zadanego ciągu tekstowego wszystkich fragmentów tekstowych zawartych między zdefiniowanymi znakami i połączenie ich w jeden ciąg rozdzielony wybranym separatorem. W tym konkretnym przypadku chodziło o wyodrębnienie wszystkich liczb zawartych między znacznikami "<id>" oraz "</id>".
Oto przykład takiego ciągu:
<id>550124</id><guid>238974shdbf23874dgf23hr</guid><id>550125</id><guid>238974shdbf23874dgf23hr</guid><id>550126</id><guid>238974shdbf23874dgf23hr</guid><id>5503454</id> <guid>238974shdbf23874dgf23hr</guid><id>550456</id> <guid>238974shdbf23874dgf23hr</guid><id>550456</id><guid>238974shdbf23874dgf23hr</guid>

Odpowiadając pytającemu, napisałem funkcję użytkownika, którą można zastosować we własnym arkuszu. Funkcję tę nazwałem LICZBY, gdyż chodziło o wyodrębnienie liczb. Po zastanowieniu pomyślałem, że taka funkcja może przydać się jeszcze komuś, więc nieco ją zmodyfikowałem, zmieniłem nazwę na EKSTRAKT i załączam zainteresowanym do ewentualnego wykorzystania.
EKSTRAKT
Zwraca ciąg złożony z wyodrębnionych fragmentów tekstowych, znajdujących się między zdefiniowanymi znakami wyróżniającymi, wewnątrz innego dłuższego tekstu. Fragmenty te są rozdzielone separatorami wskazanymi przez uzytkownika.
Składnia
Kod: Zaznacz cały   Rozszerz widokZwiń widok
EKSTRAKT(tekst;przed;za;separator)

Tekst jest przeszukiwanym ciągiem lub adresem komórki zawierającej taki ciąg.
Przed jest ciągiem poprzedzającym szukany fragment albo adresem komórki zawierającym taki ciąg.
Za jest ciągiem kończącym szukany fragment albo adresem komórki zawierającym taki ciąg.
Separator jest ciągiem rozdzielającym znalezione fragmenty albo adresem komórki zawierającym taki ciąg. Parametr może być pominięty i wtedy separatorem będzie znak spacji.
Funkcja wymaga, aby ciągi Przed i Za się różniły. Jeśli tak nie będzie, zostanie zwrócona wartość: "Ciągi PRZED i ZA nie mogą być takie same". Jeżeli ciąg Przed nie wystąpi w tekście, zwrócona zostanie wartość: "Brak ciągu PRZED". Jeżeli po zapisie Przed w tekście nie wystąpi zapis Za, zwróconym fragmentem tekstowym będzie fragment od ciągu Przed do końca tekstu.
Przykład:
Kod: Zaznacz cały   Rozszerz widokZwiń widok
=EKSTRAKT(A2;"<id>";"</id>")

Jeżeli w A2 znajdzie się tekst wymieniony jako przykład, zwrócona zostanie wartość tekstowa: 550124 550125 550126 5503454 550456 550456.
Fragmenty rozdzielone są spacją, ze względu na brak czwartego parametru.
Kod: Zaznacz cały   Rozszerz widokZwiń widok
=EKSTRAKT(A2;B2;B3;B4)

Jeśli B2 i B3 zawierają wyżej zastosowane ciągi a B4 zawiera ciąg "+^+" to wynikiem funkcji będzie ciąg: 550124+^+550125+^+550126+^+5503454+^+550456+^+550456.

Funkcję należy przekopiować do biblioteki "Standard" w kontenerze makr dokumentu Calc, wówczas będzie dostępna tylko w tym dokumencie, albo umieścić ją w bibliotece "Standard" kontenera "Moje makra", wówczas będzie dostępna we wszystkich arkuszach.
Funkcja EKSTRAKT.
Kod: Zaznacz cały   Rozszerz widokZwiń widok
Function ekstrakt(tekst,przed,za, optional separator) as string
REM Funkcja z ciągu tekstowego "tekst" wyodrebnia wszystkie teksty
REM znajdujące sie między ciagami "przed" i "za" i łączy je w jeden
REM nowy ciąg rozdzielając je ciągiem podanym jako "separator".
REM Autor: Jermor, polskie forum Apache OpenOffice i LibreOffice. (2019)
dim t as string
dim pos1 as long, pos2 as long
rem pos1 wyznacza położenie ciągu "przed", pos2 położenie ciągu "za"
dim i as integer,j as integer
if IsMissing(separator) then separator=" "
pos1=1 : pos2=1
t=""
pos1=InStr(pos1,tekst,przed)
if pos1=0 then
   ekstrakt="Brak ciągu PRZED"
   exit Function ' ciąg "przed" w ogóle nie wystepuje w tekście
End If
If przed=za then
   ekstrakt="Ciągi PRZED i ZA nie mogą być takie same"
   exit Function
End If
i=len(przed) 'zawiera długośc ciagu "przed"
j=len(za)
do
   pos2=InStr(pos1,tekst,za)
   t=t &  mid(tekst,pos1+i,pos2-pos1-i) & separator
   if pos2=0 then exit do
   pos1=InStr(pos2+j,tekst,przed)
loop while pos1<>0
ekstrakt=left(t,len(t)-len(separator))
End Function
AOO 4.1.6, LO 6.1.6 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że ktoś podał rozwiązanie.
Avatar użytkownika
Jermor
 
Posty: 734
Dołączył(a): So paź 12, 2013 11:09 am

Powrót do Projekty użytkowników

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość