Usuwanie duplikatów w jednej komórce Libre

Użytkowanie arkusza kalkulacyjnego
Yakubu14
Posty: 9
Rejestracja: pt sie 06, 2021 9:33 pm

Usuwanie duplikatów w jednej komórce Libre

Post autor: Yakubu14 »

Dzień dobry wszystkim,

Ma problem z dobraniem formuły pod usuwanie duplikatów po przecinku w jednej komórce.

Chodzi dokładnie o taki przykład:

1.0 TFSI, 1.2 TFSI, 1.4 TFSI, 1.4 TFSI, 1.2 TFSI, 1.0 TFSI, 2.0 TFSI, 1.6 TDI

żeby było:

1.0 TFSI, 1.4 TFSI, 1.2 TFSI, 2.0 TFSI, 1.6 TDI

Czy, ktoś poratuje jakaś formułą ? Ręczne usuwanie to masakra.
OpenOffice 3.1
Awatar użytkownika
Jermor
Posty: 2462
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Usuwanie duplikatów w jednej komórce Libre

Post autor: Jermor »

Podstawowe pytanie do twojego problemu. Czy chcesz ten proces wykonać tylko raz, żeby zreorganizować zapisy w swojej bazie? Czy też ma to być procedura wykonywana zawsze na danych, które będą wprowadzane?
AOO 4.1.15, LO 25.8 (x64) na Windows 11 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 istnieje jego rozwiązanie.
Yakubu14
Posty: 9
Rejestracja: pt sie 06, 2021 9:33 pm

Re: Usuwanie duplikatów w jednej komórce Libre

Post autor: Yakubu14 »

Proces będzie wykonywany zawsze na różnych danych, te są tylko przykładowe.
OpenOffice 3.1
Awatar użytkownika
Rafkus
Posty: 538
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Usuwanie duplikatów w jednej komórce Libre

Post autor: Rafkus »

EDIT: Zapraszam do zapoznania się z nowszą wersją tej funkcji, którą można znaleźć tutaj: Unikalne wystąpienia (po raz trzeci) i potrafi troszkę więcej.


Myślę, że w takim przypadku najlepsze będzie własna funkcja (makro).

Napisałem funkcję użytkownika, która zwróci unikalne wystąpienia fragmentów tekstu .
Wywołanie funkcji:
UNIKALNE( tekst; separator)
tekst - jest to ciąg znaków który ma zostać podzielony na fragmenty
separator- parametr opcjonalny, w jakim znaku ma być dokonany podział. Jeśli się go nie poda domyślnym znakiem będzie spacja.

Kod: Zaznacz cały

Function unikalne(tekst as string, optional separator as string) as string
 dim podziel(), wynik(0), i as string
 dim j, n as integer

  If IsMissing(separator)  then separator = " "      
  tekst = replace(tekst, "  ", " ")
  podziel = split(tekst, separator)   
  unikalne = trim(podziel(0))
  wynik(0)= unikalne
  n=1
  if separator <> " " then separator = separator + " "
  for each i in podziel()
     for j=0 to n
        if j = n then          
          redim preserve wynik(n)
          wynik(n)=trim(i)          
          unikalne = unikalne + separator + wynik(n)
          n=n+1
        endif
        if wynik(j) = trim(i) then exit for        
     next j
  next i
  'print(unikalne)
End Function
Jak działa ta funkcja:
  • Dany Tekst jest dzielony na fragmenty zgodnie ze zgłoszonym separatorem,
    Pierwszy fragment zostaje wpisany do wyniku,
    Następnie jest sprawdzane czy kolejny fragment tekstu zawiera się w wyniku jest identyczny z poprzednimi fragmentami
    -- jeśli jest to zostaje wybrany kolejny fragment
    -- jeśli nie, to ten fragment zostaje dopisany do wyniku, i znowu wybrany jest kolejny fragment do sprawdzenia
    itd, aż do ostatniego fragmentu
Na przykład:
Załóżmy że w komórce A1 znajduje się tekst: 1.0 TFSI, 1.2 TFSI, 1.4 TFSI, 1.4 TFSI, 1.2 TFSI, 1.0 TFSI, 2.0 TFSI, 1.6 TDI
Do komórki B1 należy wpisać formułę:

Kod: Zaznacz cały

=UNIKALNE(A1; ",")
otrzymany wynik to: 1.0 TFSI, 1.2 TFSI, 1.4 TFSI, 2.0 TFSI, 1.6 TDI

Załóżmy że w komórce A2 znajduje się tekst: 1.0 TFSI, TFSI, 1.6 TDI, TDI
W komórce B2jest formuła:

Kod: Zaznacz cały

=UNIKALNE(A2; ",")
otrzymany wynik to: 1.0 TFSI, 1.6 TDI
Ze względu na prymitywność stworzonej przeze mnie funkcji słowa TFSI oraz TDI zostały wykluczone - zawierają się niestety we wcześniejszym fragmencie.
W obecnej, ulepszonej funkcji zostają porównywane całe fragmenty tekstu więc wynikiem zastosowanej funkcji będzie: 1.0 TFSI, TFSI, 1.6 TDI, TDI


O używaniu własnych funkcji można przeczytać w tym opracowaniu: https://yestok.pl/ooo/y58.php
Ostatnio zmieniony wt gru 07, 2021 11:47 am przez Rafkus, łącznie zmieniany 4 razy.
Powód: Ulepszyłem funkcję
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Yakubu14
Posty: 9
Rejestracja: pt sie 06, 2021 9:33 pm

Re: Usuwanie duplikatów w jednej komórce Libre

Post autor: Yakubu14 »

Super dziękuje za pomoc, tylko pytanie nie mam funkcji unikalne libre to 7.2.0 czy ma być inna wersja ?
OpenOffice 3.1
Jan_J
Posty: 4639
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Usuwanie duplikatów w jednej komórce Libre

Post autor: Jan_J »

Funkcję UNIKALNE napisał @Rafkus i dostarczył jej kod w poście wyżej.
Musisz ją osadzić w swojej bibliotece makr, na wszystkich komputerach na których taka akcja ma być wykonywana.
Narzędzia → Makra → Zarządzaj → Basic → Moje makra → (wybierz bibliotekę, może być istniejąca Standard albo możesz utworzyć nową) → Edycja → (wklej kod pobrany z postu @Rafkusa).
Tak zainstalowaną funkcję można będzie wykonywać we wszystkich skoroszytach otwieranych na tym komputerze.

Można też alternatywnie osadzić funkcję w dokumencie skoroszytu zamiast w środowisku użytkownika. Wtedy będzie dostępna po otwarciu na dowolnym komputerze z Calcem, ale uwaga: każdy skoroszyt będzie miał osobną kopię funkcji.
JJ
LO (25.2) ∙ Python (3.13|3.10) ∙ Unicode 16 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Awatar użytkownika
Rafkus
Posty: 538
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Usuwanie duplikatów w jednej komórce Libre

Post autor: Rafkus »

To jest funkcja (makro) zrobione przeze mnie, nie ma jej ani w LO ani w OO.
Powtórzę: o stosowaniu makr w LO i OO przeczytaj to:
https://yestok.pl/ooo/y58.php
Lub nieco skromniejsze opracowanie:
http://przepis-na-lo.pl/2012/12/urucham ... e-makrami/
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Awatar użytkownika
Jermor
Posty: 2462
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Usuwanie duplikatów w jednej komórce Libre

Post autor: Jermor »

Także poszedłem drogą @Rafkusa. Bo nie ma tu możliwości zbudowania formuł na podstawie wbudowanych funkcji. W swojej funkcji użytkownika najpierw znormalizowałem cały tekst. Chodzi mi o to, aby wszystkie elementy miały taką samą budowę. To znaczy, każdy zaczynał się spacją, a kończył separatorem. Ponieważ nie wiadomo, w jaki sposób dane będą wpisywane, zastosowałem taki sposób normalizacji:
  • Z tekstu zostaną usunięte wszystkie spacje początkowe, końcowe, a wielokrotne spacje wewnątrz tekstu zostaną zastąpione pojedynczą spacją. Takie działanie może wykonać funkcja arkusza kalkulacyjnego TRIM() (USUŃ.ZBĘDNE.SPACJE()) dlatego została wykorzystana w makrze.
  • Przed pierwszym opisem została dodana spacja.
  • Ponieważ wszystkie wielokrotne spacje są zastąpione spacją pojedynczą to na wszelki wypadek każdy dwuznak "spacja separator" został zastąpiony separatorem. To ma zabezpieczyć sytuację, gdy separator został postawiony po spacji następującej po właściwym opisie.
  • Każdy dwuznak "separator spacja" został zastąpiony separatorem. To po to, aby "wyłapać" sytuację gdy nie postawiono spacji po separatorze przed kolejnym opisem w ciągu. Dzięki temu wszystkie opisy są bezpośrednio poprzedzone separatorem.
  • Teraz można każdy separator zastąpić sekwencja "separator spacja".
Po podzieleniu tekstu na fragmenty sortuję tablicę wynikową, a następnie wpisuję do odtwarzanego tekstu tylko wpisy różniące się między sobą.
W funkcji można podać dwa separatory. Pierwszy, separator źródła, określa jaki znak jest znakiem separatora w tekście źródłowym. Drugi separator, separator docelowy, określa jaki separator może zostać użyty w tekście wynikowym. Funkcja przyjmuje, że w razie niepodania separatora jest nim przecinek.
Oto treść funkcji:

Kod: Zaznacz cały

Function sort (kom As String, optional seps As String, optional sept As String)
If IsMissing(sept) then sept=","
If IsMissing(seps) or seps=0 then seps=","
if len(kom)=0 then sort="nie ma tekstu" : exit Function 'wiersz dodany podczas edycji
'Znormalizowanie tekstu
oFA = createUnoService( "com.sun.star.sheet.FunctionAccess" )
tx= " " & oFA.callFunction( "TRIM", array(kom) )
tx=Replace(tx," " & seps , seps)
Tx=Replace(tx, seps & " ",seps)
tx=Replace(tx,seps, seps & " ")
Dim t()
t=split(tx,seps)
J=1
Do until j=0
	j=0
		For i=0 to ubound(t)-1
			if T(i)>t(i+1) then
				zn=t(i) : t(i)=t(i+1) : t(i+1)=zn : j=1
			End if
		Next
Loop
tx=t(0)
For i=1 to ubound(t)
if t(i)>t(i-1) then tx=tx & sept  & t(i)
next
sort=tx
End Function
Ostatnio zmieniony sob sie 07, 2021 10:36 pm przez Jermor, łącznie zmieniany 1 raz.
Powód: Poprawiłem funkcję. Gdy zostanie zastosowana do pustej komórki wystawi tekst "nie ma tekstu"
AOO 4.1.15, LO 25.8 (x64) na Windows 11 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 istnieje jego rozwiązanie.
Awatar użytkownika
Jermor
Posty: 2462
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Usuwanie duplikatów w jednej komórce Libre

Post autor: Jermor »

Nie napisałem niczego o wywołaniu funkcji:
=SORT(A1;sep źródła;sep docelowy) ilustracja poniżej
obraz_2021-08-07_234525.png
obraz_2021-08-07_234525.png (5.48 KiB) Przejrzano 5134 razy
W innym opracowaniu https://yestok.pl/lbo/y61.php jest wideo, jak dodać swoją funkcję do biblioteki.
AOO 4.1.15, LO 25.8 (x64) na Windows 11 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 istnieje jego rozwiązanie.
Awatar użytkownika
Rafkus
Posty: 538
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Usuwanie duplikatów w jednej komórce Libre

Post autor: Rafkus »

Drobna uwaga odnośnie makra @Jermora:
Z moich doświadczeń z makrami w środowisku OO wynika, że optymalne parametry makr muszą być typu variant gdyż dla innego typu zmiennej (a konkretniej dla stringa) funkcja IsMissing() zwraca zawsze FALSE.
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Awatar użytkownika
Jermor
Posty: 2462
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Usuwanie duplikatów w jednej komórce Libre

Post autor: Jermor »

Sprawdziłem to od razu. Gdy zmiennej nie ma, zwraca True.
AOO 4.1.15, LO 25.8 (x64) na Windows 11 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 istnieje jego rozwiązanie.
Yakubu14
Posty: 9
Rejestracja: pt sie 06, 2021 9:33 pm

Re: Usuwanie duplikatów w jednej komórce Libre

Post autor: Yakubu14 »

Dziękuje za pomoc. Metoda od @Rafkus działa i to jest właśnie to czego szukałem. Za wszystkie inne podpowiedzi też dziękuje, bo wcześniej trzeba było to robić ręcznie.
OpenOffice 3.1
ODPOWIEDZ