![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 19 Pomógł: 0 Dołączył: 23.05.2009 Ostrzeżenie: (0%) ![]() ![]() |
Witam
Wiem że o duplikatach była tu już mowa jednak nie znalazłem odpowiedzi na mój problem, a przedstawione tu rozwiązania ni zadziałały mi. Importuję dane z pliku do dwóch tablic i łączę je w trzeciej ... wspólnej w odpowiedniej konfiguracji. Jednak w tej chwili przy 4 rekordach zdarzają się duplikaty typu:
gdzie rekord 1 i 3 są takie same tylko odwrócone. Jest to co prawda poprawne ale nie pożądane i chciałbym by się nie pojawiło. Tym bardziej że dwie pierwsze tabele będą zawierały czasem nawet po kilkadziesiąt rekordów. czyli szukanie takich duplikatów będzie raczej ciężkie. Gdyby ktoś miał jakiś pomysł ... byłbym wdzięczny |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 2 885 Pomógł: 463 Dołączył: 3.10.2009 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
-------------------- Nie pomagam na pw, tylko forum.
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 19 Pomógł: 0 Dołączył: 23.05.2009 Ostrzeżenie: (0%) ![]() ![]() |
Hmm ... myślę że było by to za proste. Dla pewności jeszcze przetestowałem ale to nie zadziałało.
myślę że logicznie patrząc na to oba rekordy są różne. W tej chwili to są dwie kolumny z tymi samymi danymi na przemian ale robiąc z tego jedną kolumnę ... to aaaxxx i xxxaaa to dwie zupełnie różne wartości. myślę że dlatego array_unique nie rozpoznaje tego i dlatego mam z tym problem. Myślałem też by zrobić kopię tablicy zamienić kolumny miejscami i porównać je przez array_search ... wyeliminować wspólne rekordy, ale obawiam się że to usunie mi oby dwie pozycje |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 2 885 Pomógł: 463 Dołączył: 3.10.2009 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Mam taką koncepcję, spróbuj tak: masz 2 osobne tablice $tab1 i $tab2 i teraz:
- scalasz jej tymczasowo w jedną powiedzmy $tab0 - jedziesz w pętli po pierwszej małej tablicy ($tab1), kontrolując wartość indeksu ($i++) - sprawdzasz w każdej iteracji czy zlepek elementu x tablicy1 i tablicy2 oraz odwrotnie (2 i 1) istnieje w tablicy0:
Ten post edytował darko 22.12.2009, 23:15:56 -------------------- Nie pomagam na pw, tylko forum.
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 5 Pomógł: 0 Dołączył: 16.12.2009 Ostrzeżenie: (0%) ![]() ![]() |
Proponuję najpierw znormalizować dane czyli np. kolumnę lewą i prawą rozpisać tak, aby lewa zawierała alfabetycznie wcześniejszą wartość.
Nie pojawi się wtedy aaaxxx i xxxaaa tylko 2 razy aaaxxx, to które należy usunąć zależy od Ciebie. |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 19 Pomógł: 0 Dołączył: 23.05.2009 Ostrzeżenie: (0%) ![]() ![]() |
darko Twoje rozwiązanie jest ok i nawet o tym pomyślałem ale jest jedna zła rzecz w tym rozwiązaniu ... wywala mi tu obydwa kombinacje a chodzi mi o wywalenie tylko jednej kombinacji (dowolnej).
kabot dane pochodzą z 2 różnych tabel i łączą się w 3 wspólnej w 2 kolumnach. Jak dokonać zamiany wpisów w dokładnie tym jednym rekordzie. Poza tym tak jak wcześniej mówiłem będą przypadki że tabele 1 i 2 będą się składały z kilkudziesięciu wierszy co po dokonaniu kilku kombinacji da w tabeli 3 ponad setke kombinacji. Jak miałbym wtedy trafić w konkretne rekordy? |
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 2 885 Pomógł: 463 Dołączył: 3.10.2009 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Pokaż wszystkie trzy tablice: dwie małe i jedną będącą połączeniem tych dwóch małych. Pokaż też swój kod, jak łączysz te dwie do jednej itd. Coś mi się wydaje, że sprawa jest bardziej prosta niż się wydaje...
// edit nie wiem czy nie przekombinuję, ale sprawdź co da zamiana && na xor Ten post edytował darko 23.12.2009, 13:22:59 -------------------- Nie pomagam na pw, tylko forum.
|
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 1 590 Pomógł: 185 Dołączył: 19.04.2006 Skąd: Gdańsk Ostrzeżenie: (0%) ![]() ![]() |
Cytat Importuję dane z pliku do dwóch tablic i łączę je w trzeciej ... wspólnej w odpowiedniej konfiguracji - problem stary jak świat, bo np. jeden przedstawi się PESELem, inny REGONem, trzeci NIPem etc. Metodologia postępowania jest taka:1. Decydujemy jakie warunki musi spełniać rekord, by był uznany za duplikat (np. identyczne nazwisko i imię jeszcze nie, ale imię + nazwisko + numer telefonu już tak) 2. Tworzymy odpowiednie pole, gdzie generujemy unikatowy klucz: - u Ciebie będzie to trochę bardziej skomplikowane, bo np. Jan Karol i Karol Jan to będą identyczne rekordy ![]() - wtedy niezależnie od tego, czy "Jan" będzie 1 czy 2, wygenerowany klucz będzie identyczny 3. I teraz mamy już prosto: - jeśli używamy bazy to wystarczy dodać pole "token" i nałożyć indeks unique - duplikaty zostaną odrzucone - jeśli pliku/tablicy to też nie jest trudno - konstrujemy tablicę tak, aby jej kluczem był nasz token: - oczywiste, że nie mogą istnieć dwa elementy o identycznym kluczu, więc będzie tylko jeden Jan Karol czy też Karol Jan ![]() |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 19 Pomógł: 0 Dołączył: 23.05.2009 Ostrzeżenie: (0%) ![]() ![]() |
A jednak nie działa
![]() Dziękuję bardzo za pomoc ... ale już działa ![]() Dzięki darko za naprowadzenie mnie na odpowiedni tok myślenia ![]()
i teraz zmieniając kolejność kolumn w zapytaniu IF otrzymuję albo pierwszy albo drugi wpis ... mogę wybierać. Myślę że spokojnie należy ci się POMÓGŁ. Jeszcze raz dzięki. Dla mnie temat do zamknięcia. ******************************************************* ******************************************************* Wracam niestety do tematu ![]() Co prawda post będzie obszerny ale postaram się przedstawić co ma wykonać kod. Otóż chcę zrobić programik który ma na celu zamianę listy połączeń elektrycznych wykonanej w excelu w listę punkt-punkt do programu testera. Oto jak wygląda schemat i może jeszcze jak mogą wyglądać inne schematy ponieważ ten nad którym pracuję teraz jest jednym z prostszych. tabela w excelu to: KOSC1 PIN1 KOSC2 PIN2 PRZEWÓD X57 Klip 1 22:03 X44:2 1 Klip 1 22:01 X44:1 1 Klip 1 22:02 X44:1 2 X44:2 2 40:01 Wynik z całości powinien wyjść taki : X44:1/2 - X44:2/2 X44:1/1 - X57 X44:1/1 - X44:2/1 X44:2/1 - X57 Czyli jak widać wszystkie możliwe kombinacje bez powtórzeń gdzie pominięty jest element o nazwie Klip1 (tak jakby w to miejsce włożyć poszczególne piny) teraz czas na kody: Ładuję dane z pliku:
Wynik to: pierwsze gotowe wpisy 1. X44:1/2 (40:01) - X44:2/2 (40:01) - jedno poprawne połączenie -------------------------- gotowe zamienniki klipa 1. Klip 1 - X57/2 (22:03) 2. Klip 1 - X44:2/1 (22:01) 3. Klip 1 - X44:1/1 (22:02) Wykonuję podmianę Klip 1 na wcześniej przypisane pozycje:
i tu zaczynają się schody ![]() Wynik jaki dostaję to : X57 (22:03) - X44:2/1 (22:01) X57 (22:03) - X44:1/1 (22:02) X44:2/1 (22:01) - X57 (22:03) X44:2/1 (22:01) - X44:1/1 (22:02) X44:1/1 (22:02) - X57 (22:03) X44:1/1 (22:02) - X44:2/1 (22:01) gdzie pogrubione pozycje są poprawne a pozostałe zbędne Niestety in_array nie działa tu. array_unique tez tu nie pomaga Ma ktoś może jakiś pomysł jak otrzymać wynik bez powtórzeń? Ten post edytował miki_kol 27.12.2009, 16:37:02 |
|
|
![]()
Post
#10
|
|
![]() Grupa: Zarejestrowani Postów: 1 590 Pomógł: 185 Dołączył: 19.04.2006 Skąd: Gdańsk Ostrzeżenie: (0%) ![]() ![]() |
Przecież napisałem w poście wyżej - masz wygenerować KLUCZ, którego bazą będą pola, które nie mogą się powtarzać, pola te wrzucasz do tablicy, sortujesz (by zapewnić zawsze identyczną kolejność elementów, niezależnie od ich położenia) a utworzony klucz będzie dodatkowym elementem (utworzonym sztucznie), po którym będą odrzucane duplikaty. Algorytm tworzący klucz można zmieniać w zależności od sytuacji.
Ten sam mechanizm możesz wykorzystać w excelu, by dodać dodatkową kolumnę decydującą o tym, czy rekord będzie unikalny czy nie. |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 19 Pomógł: 0 Dołączył: 23.05.2009 Ostrzeżenie: (0%) ![]() ![]() |
hm ... myślałem już o jakichś prefiksach i takich innych ... tamto nie zadziałało
teraz właśnie rozważam twoje Pilsener rozwiązanie i jednej rzeczy nie mogę pojąć (może tępy jestem a może już za długo nad tym siedzę) ... chodzi mi o zmienną $warunki . Ponieważ moje dane są w tablicy asocjacyjnej ... w myśl tego co ty mi mówisz miałbym je przypisać do zwykłej ... (tak zrozumiałem) ... nie rozumiem tylko w jaki sposób. Wygenerowałem klucz md5 dla wszystkich par tylko do czego to porównać ponieważ teraz wszystkie są różne ... X44:2/1 - X57/2 (17b65e37aeeb86c8cf95643eeff70991) X44:1/1 - X57/2 (9409cdf46bcd58d9406b44ab1cbd9c63) X57/2 - X44:2/1 (5346a1bdddf21cbd033c3bb550de28d5) X44:1/1 - X44:2/1 (b9b025bfe3ebcbab67f34f4e68131c66) X57/2 - X44:1/1 (d0dafa1860b4f41d232ecb2902067df4) X44:2/1 - X44:1/1 (a0cb3a5cc1efabec02922e89045bc531) Gdybyś zechciał jeszcze coś podpowiedzieć ... i nie bić ![]() |
|
|
![]()
Post
#12
|
|
![]() Grupa: Zarejestrowani Postów: 1 590 Pomógł: 185 Dołączył: 19.04.2006 Skąd: Gdańsk Ostrzeżenie: (0%) ![]() ![]() |
Pokazałbyś kod, którym to robisz.
Napiszę jeszcze raz: 1. Masz tablicę, która powiedzmy wygląda tak: Index | Pole 1 | Pole 2 | Pole n ------------------------------------ abcde|Jan|Karol|qwerty qwerty|Karol|Jan|uiopl zxcvb|Abcde|Xyzwe|rfcvg Jest to tablica asocjacyjna, gdzie każdy element jest opisany indexem tekstowym oraz jest tablicą, która składa się z pole 1, pole 2, pole n. 2. Masz zrobić identyczną tablicę asocjacyjną z tym, że: - kluczem już nie będzie np. abcde lecz md5 z JanKarol, pamiętaj o tym, że składniki klucza musisz posortować! Inaczej Jan Karol będzie różne od Karol Jan - dotychczasowy klucz możesz zachować zapisując go jako kolejne pole o dowolnej nazwie - tablica będzie wyglądała teraz tak: Nowy Index | Stary Index | Pole 1 | Pole 2 | Pole n ------------------------------------ d0fbadd6b35d30e36e71e835a0aa8d7c|abcde|Jan|Karol|qwerty d0fbadd6b35d30e36e71e835a0aa8d7c|qwerty|Karol|Jan|uiopl 4a2d95ebf80ac5e55f4678b9e80d8f2a|zxcvb|Abcde|Xyzwe|rfcvg A ponieważ nie mogą istnieć dwa elementy o tym samym indeksie, któryś z tym "Jan Karol" zostanie wyeliminowany, który to zależy od kolejności parsowania tablicy. Próbuj coś zrobić i podawaj koniecznie kod. |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 19 Pomógł: 0 Dołączył: 23.05.2009 Ostrzeżenie: (0%) ![]() ![]() |
Witam raz jeszcze. Przepraszam Pilsener bo po treści wnioskuję że wyprowadziłem cię trochę z równowagi.
Jeśli chodzi o kod to zamieściłem go wcześniej łącznie z przedstawieniem tematu zagadnienia. Niestety Twoje rozwiązanie nie do końca było dla mnie zrozumiałe ponieważ nie wiedziałem jak pozmieniać zapisy kolumn tak jak ty to przedstawiłeś czyli Index | Pole 1 | Pole 2 | Pole n ------------------------------------ abcde|Jan|Karol|qwerty qwerty|Karol|Jan|uiopl zxcvb|Abcde|Xyzwe|rfcvg tak by te same wartości były w tych samych kolumnach. Puenta jest taka że poradziłem sobie ![]() Rozwiązanie przyszło po rozpatrzeniu wszystkiego od końca czyli poprzez eliminację przykład na podstawie tabelki - wiersze to jedna tabela, kolumny to druga tabela
miejsca "------" czyli wyeliminowane na wsztępie te same dane miejsca "brak" czyli dane usunięte w kolejnych obrotach pętli by nie były brane pod uwagę Po poskładaniu tego w całość mamy pary bez powtórzeń - w matematyce kombinatoryka bez powtórzeń Dzięki za próbę pomocy Pozdrawiam |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 14.08.2025 - 05:42 |