[SOLVED] Część wspólna

Użytkowanie arkusza kalkulacyjnego
JKrzysio
Posty: 7
Rejestracja: śr lut 27, 2013 8:36 pm

[SOLVED] Część wspólna

Post autor: JKrzysio »

Witam
Próbuję w programie Calc znaleźć sposób na sprawdzenie czy w danym zbiorze elementy się powtarzają. Część z nich traktowanych jest jako tekst, a część jako liczby.
Zależy mi na tym, aby sprawdzić czy dane z komórek nie powtarzają się w innych.

Proszę o pomoc
Open Office 3.1.1 (Win XP)
Jan_J
Posty: 4560
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Część wspólna

Post autor: Jan_J »

* jedna wartość, podaje numer albo błąd: podaj.pozycję(wartość; zakres; 0);
* jedna wartość, zwraca tak/nie: nie(czy.błąd(podaj.pozycję(wartość, zakres; 0))) -- można zapytać wzdłuż jednego siągu o przynależność do drugiego ciągu;
* wiele wartości, ciąg tak/nie: nie(czy.błąd(podaj.pozycję(wartości, zakres; 0))) zatwierdzane Ctrl+Shift+Enter -- w zasadzie to samo, tyle że jednym ruchem;
* zawartość części wspólnej obu spisów: filtr na podstawie wartości True z tej ostatniej formuły. Nie da się tego łatwo zrobić jedną formułą, chociaż można zestawem formuł.

Wydajność tych operacji nie powala: są to wielokrotne przeszukiwania liniowe.

Jeżeli danych jest dużo, radzę wessać je do bazy danych (niekoniecznie do Base), i spytać o coś w rodzaju SELECT * FROM dane1 INTERSECT SELECT * FROM dane2;
albo SELECT jakieś pola 1 FROM dane WHERE warunek1 INTERSECT SELECT jakieś pola 2 FROM dane WHERE warunek2;
Jak widać jest dużo prościej -- tylko że Base zdaje się ma alergię na operacje UNION, INTERSECT i EXCEPT.
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
JKrzysio
Posty: 7
Rejestracja: śr lut 27, 2013 8:36 pm

Re: Część wspólna

Post autor: JKrzysio »

dzięki za szybką odpowiedź.
Zdaje się, że jednak niebardzo ogarniam :)

Może na przykładzie będzie łatwiej. Załóżmy, że w kolumnie B1;B10 mam wartości. Chciałbym aby w komórce c1 (o ile to możliwe, by to była jedna komórka) zwróciło wartości z obszaru B1;b10, które się powtarzają (dwa lub więcej razy). Rozwijając przykład chciałbym aby z przykładowego zbioru <1;3;4;1;2;6;7;3;1;5> w komórce C1 pojawiły się cyfry 1 oraz 3.

W moim przypadku jest w tej chwili 400 pozycji (a będzie więcej) liczb dziewięciocyfrowych i bardzo mi zależy żeby się pozbyć powtórzeń.
Open Office 3.1.1 (Win XP)
Jan_J
Posty: 4560
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Część wspólna

Post autor: Jan_J »

W jednej komórce nie opłaca Ci się mieć wielu wartości. O wiele lepiej jest mieć ich spis w kolumnie.
Sprawdź załącznik. Zrobiłem tam to, o czym napisałem wyżej.

Hej, ale w poście piszesz o unikaniu powtórzeń, a w tytule o części wspólnej. To są inne zadania! Ja pisałem o wyznaczaniu części wspólnej 2 spisów, sugerując się tytułem. Zmień temat pierwszego postu, dla potomności.

W bazie danych: banalne SELECT DISTINCT * FROM spis;
W arkuszu: sprawdź http://forum.openoffice.org/pl/forum/se ... aj%C4%85ce -- jak nie wystarczy, napisz, pokombinujemy.
Załączniki
intersect.ods
(11.05 KiB) Pobrany 265 razy
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
JKrzysio
Posty: 7
Rejestracja: śr lut 27, 2013 8:36 pm

Re: Część wspólna

Post autor: JKrzysio »

nie całkiem o tym myślałem. odnosząc się do Twojego przykładu, zależałoby mi raczej na sprawdzeniu, czy aby w pierwszej kolumnie nie ma np "ala" dwa razy (lub więcej), niż na porównaniu dwóch kolumn.

Przykład w załączniku
Załączniki
przykład.ods
(13.27 KiB) Pobrany 239 razy
Open Office 3.1.1 (Win XP)
Minio
Posty: 323
Rejestracja: śr sie 01, 2012 1:48 am
Lokalizacja: (Poznań|Dziwnów), Polska

Re: Część wspólna

Post autor: Minio »

Najprościej to będzie zaznaczyć cały zakres komórek, wybrać z menu Format → Formatowanie warunkowe → Formatowanie warunkowe, w nowym oknie Dodaj i na listach rozwijanych ustawić Wartość komórki jest, duplikat. Potem wybrać jakiś styl z listy. Po kliknięciu OK wszystkie komórki mające takie same wartości zostaną oznaczone danym stylem.

Przy czym w LibreOffice 3.5 oraz wcześniejszych, a także w OpenOffice.org/Apache OpenOffice, to okienko wygląda inaczej niż opisałem. Zasada działania jest jednak identyczna.

Gorzej, jeżeli chcesz zaznaczyć duplikaty wartości w danym miejscu kolumny (czyli dopiero drugie i kolejne wystąpienia mają być zaznaczone). W takim wypadku musisz już skorzystać z formuły. Np. taka wklejona w komórce B2 i kolejnych da pożądane efekty:

Kod: Zaznacz cały

=JEŻELI(WYSZUKAJ.PIONOWO(A2;$A$1:A1;1;0);"Powtarza się";"")
Wyszukuje ona wartość sąsiedniej komórki w zbiorze danych od pierwszego wiersza do wiersza tuż nad komórką.
Mój blog o używaniu LibreOffice
LibreOffice 4.2.6, Debian testing amd64
JKrzysio
Posty: 7
Rejestracja: śr lut 27, 2013 8:36 pm

Re: Część wspólna

Post autor: JKrzysio »

Hej

Dzięki za odpowiedzi. Nie rozwiązałem jeszcze problemu. M.in. dlatego, że w mojej wersji OO w Formatowaniu warunkowym nie ma opcji "duplikat" - w załączniku zrzut z ekranu. Próbowałem to zrobić w ustawieniach "równy", ale bez efektu.
Czy ja dobrze rozumiem, że w miejscu na adres komórek należy podać zakres, który chciałbym sprawdzić na powtarzanie się w nim pewnym danych?
Załączniki
1.JPG
Open Office 3.1.1 (Win XP)
JKrzysio
Posty: 7
Rejestracja: śr lut 27, 2013 8:36 pm

Re: Część wspólna

Post autor: JKrzysio »

uff.. Udało się :D
Pokombinowałem trochę z tą formułą i dopasowałem do mojego pliku i ładnie zaznacza powtórzenia.

Dzięki wielkie za pomoc :D
Open Office 3.1.1 (Win XP)
Minio
Posty: 323
Rejestracja: śr sie 01, 2012 1:48 am
Lokalizacja: (Poznań|Dziwnów), Polska

Re: Część wspólna

Post autor: Minio »

JKrzysio pisze:Dzięki za odpowiedzi. Nie rozwiązałem jeszcze problemu. M.in. dlatego, że w mojej wersji OO w Formatowaniu warunkowym nie ma opcji "duplikat" - w załączniku zrzut z ekranu. Próbowałem to zrobić w ustawieniach "równy", ale bez efektu.
U mnie w LO 3.5.5 jest tam pozycja „wartości zdublowane” (jak widać, w 3.6 zmieniło się tłumaczenie). Może dodali to dopiero w LibreOffice? Albo w OOo 3.2 lub 3.3? Trudno mi ocenić. Byłem przekonany, że opcja ta jest już od dłuższego czasu, ale widać się myliłem.
Na taki problem mogę co najwyżej doradzić aktualizację pakietu — 3.1 to dość archaiczna wersja.
Mój blog o używaniu LibreOffice
LibreOffice 4.2.6, Debian testing amd64
JKrzysio
Posty: 7
Rejestracja: śr lut 27, 2013 8:36 pm

Re: [SOLVED] Część wspólna

Post autor: JKrzysio »

Witam ponownie.

Ostatnim razem wskazówki okazały się bardzo przydatne. Dzięki jeszcze raz.

Mam jeszcze jeden problem. Nieco innej natury. Jak wcześniej wspominałem, tych danych jest sporo (mam około tysiąca). Kolejną partię chciałbym wpisywać w Arkusz2, dla odznaczenia źródła.
Czy da się zrobić, aby np w komórce B1 arkuszu2 był cały "pion" B1:b1000. Tak żebym po wpisywaniu danych w komórkę b2 i niższe sprawdzał czy powtarzają się z danymi z komórki b1 (czyli całym arkuszem1) i między sobą (jak wcześniej)
Open Office 3.1.1 (Win XP)
Jan_J
Posty: 4560
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: [SOLVED] Część wspólna

Post autor: Jan_J »

A po co dublować dane? przecież w arkuszu 2 możesz się odwołać do kolumny danych z arkusza 1. Czy to w formułach, czy to w formatowaniu warunkowym.
Upychanie wielu danych w jednej komórce, nawet jeżeli czasami możliwe technicznie, zawsze prowadzi do kłopotów przy próbie ich wyłuskania.
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
JKrzysio
Posty: 7
Rejestracja: śr lut 27, 2013 8:36 pm

Re: [SOLVED] Część wspólna

Post autor: JKrzysio »

Próbowałem zrobić odwołanie w komórce b1 arkuszu 2 (=Arkusz1.B1:B991) a w komórkach poniżej (b2,b3,b4..) wpisywać dalsze wartości. w komórce c2 arkuszu 2 wpisuje poprzednią formułę, która tak dobrze spisywała się poprzednio - (=JEŻELI(WYSZUKAJ.PIONOWO(B2;$B$1:B1;1;0);"Powtarza się";"")

o ile dane wpisane "ręcznie" podlegaja tej formule między sobą, to komórka b1 (w arkuszu 2) nie jest brana pod uwagę. specjalnie wpisałem wartość, która była w przedziale b1:b991 arkusza1, aby to sprawdzić.
Open Office 3.1.1 (Win XP)
ODPOWIEDZ