• Offtopic
  • Web Development rasprave/preporuke/problemi

Nije bas post za ovaj topic, ali da ne otvaram drugi 😊
@Fico, @foggy, bilo tko drugi...
Imam dva polja koja treba usporediti po jednoj zajednickoj kolumni odnosno stupcu. Radi se o email adresi gdje se gleda koji clanovi prvog polja nisu prisutni u drugom polju i obrnuto.
Za ovo sam napisao binary search algoritam i to sve radi. Medutim, kako bi binary search radio, inicijalno polje mora biti sortirano po email adresi.
Radi se o obicnom stringu i koristio sam Sort-object cmdlet u PWSu, ali sam primjetio da ne radi dobro svoj posao za pojedine entrye.
Onda sam napisao algoritam za quick sort (mozete na wiki pogledat o cemu se radi) i to radi ok... ALI samo na polju sa jednim stupcem.
Kako ja imam polje sa vise stupaca gdje primjerice ROW1 ima medusobno povezane podatke za stupac 1, 2, 3 i 4, ovaj quick sort bi trebao nakon sortiranja stupca 1, pretumbat adekvatno i ostale stupce polja.

Imate li kakav savjet, ideju kako primjeniti quicksort na polje sa vise stupaca?

    chono U kojem formatu imas te kolone? Imas neki excel file ili nesto?
    Quick solucija Javascript:
    Array emal adresa jednom stupca, foreach petlja, contains metoda kroz drugi array u kojem gledas jel ga ima, ako ima, trpas u novi array ili sto zelis.
    Ali zanima me izvor adresa. Excel ti ima VSLookup koji ti to odradi u 3 klika

    chono ako radis sa bazom, ako dobro shvacam zahtjev, mislim da mozes selfjoin napravit:
    Select a.mail1 from tvoja_tablica a join tvoja_tablica b on a.mail1 = b.mail2 daje sve mailove iz stupca 1 koji imaju isti zapis u stupcu 2. Svi koje ne vrati nemaju.

    @foggy i @sanzo problem je sto su ta dva polja zapravo dobivena exportom iz dva totalno odvojena sustava i enrichao sam dodatno podacima iz ADa. Nije baza, vec ta dva polja postoje samo unutar skripte.
    Koristio sam powershell je u njemu znam delat.
    Dakle contains i slicne metode rade, ali se skripta vrti po 5min. Sa binary search algoritmom to se radi u par sekundi. Imam vise ovakvih skripti, zbog stvari o kojima ne smijem pisati,, pa mi je 5min po skripti previse vremena za daily runove

      chono Koja skripta? .ps powershell skripta, bash skripta, neka treca? U njoj imas te vrijednosti pohranjenje u varijabli?

      Bonus pitanje:
      Kad dobijes rez, kud s njim? dalje pucas iz skripte trigger na neku drugu ili ti je samo bitan podatak da ga negdje nekako pohranis?

        foggy powershell skripta koja je spremljena na git, Jenkins je pokupi i izvrti, a rezultat je csv file koji se salje mailom ljudima koji to trebaju dobiti

          chono Mozes skriptu rekreirat da sadrzi strukturu iz primjera i zakacit negdje da probamo nesto? Barem da napravis te kolone i objasnis jos tocnije sta iz koje i gdje vucem? Tesko mi je napamet pricat, moram uzet u ruke i probat, radio sam svasta kroz powershell i cudno mi je da ti traje dugo. Ali i dalje mi fali malo konteksta. Koristim TeamCity, poweshell i bash, pa znam neke stvari napisati, ali stvarno je tesko bez primjera.

            Sada sam tek vidio na da me se zvalo. Isto kao i @foggy , ako se nekako uspije neki jednotavniji anonimizirani primjer složiti, lakše bi se dalo razmišljati. Ne igram se inače s powershellom kad se takve stvari izvode, ali bože moj, jedna glava više ne bude škodila.

            foggy moze, modificirat cu polja sa filtivnim podacima i dati svoj kod da vidis.
            Mislim, ja sam napisao quicksort algoritam (https://en.m.wikipedia.org/wiki/Quicksort) koji zaista sortira cijelo polje, ali nazalost samo po "Mail" kolumni, sve ostale izgubim nakon sorta. To bi trebao editirat i implementirat da se sortiraju i ostale kolumne polja.
            Tipa da funkciji quicksort das parametre array i property, te da funkcija operira nad cijelim poljem po tom propertyu, ali da na tom istom indexu polja uzme u obzir i ostale propertye i sortira ih zajedno sa inicijalnim.

            Do tada, evo malo dokumentacije 🙂
            https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/get-unique?view=powershell-7.2

            Micanje duplikata iz arraya u powershellu:
            https://stackoverflow.com/questions/1391853/removing-duplicate-values-from-a-powershell-array

            Možda nešto bude potrebno. Ima i sort arrayeva, sve se da, sam trebamo primjer i zahtjeve.
            Uglavnom, više ćemo nakon primjera, treba dovest podatke prvo u red da se lako s njima rade akcije. Isto tako, ako koristš Jenkins onda možeš rezultate spremat u Jenkins build varijable pa njih lako preneseš u sljedeći korak build pipelinea i radiš s njima šta treba. Ima 100 načina, naći ćemo najbolji.

            @foggy i @Fico
            Hej ekipa, evo detaljnije objasnjena:

            POLJE 1
            Email
            Date

            POLJE 1 ENRICHED IZ AD-a
            Date
            SamAccountName
            RealName
            Office
            Email

            POLJE 2
            ControllerId
            EventTime
            Username
            UserToken
            EventId

            Znaci tek kada "obogatim" POLJE 1 sa podacima iz ADa, mogu raditi usporedbu po SamAccountNameu (username):

            foreach ($Entry in $POLJE1) {
            if ($POLJE2.username -notcontains $Entry.SamAccountName) {
            $Difference += $Entry.Email
            }
            }

            Problem je upravo to "obogacivanje" POLJA1, gdje koristenje "where-object", "contains" ili bilo cega drugog traje predugo, jer je AD uz sve filtere prevelik i to vrti jako dugo.

            Ja sam sam tu potrebu koristio Binary Search algoritam:

            function BinarySearch {


            Param ($SortedArray, $Attribute, $SearchedObject)
            
            $startIndex = 0
            $endIndex = $SortedArray.length - 1
            $Output = @()
            
            if ( ( $SortedArray[$startIndex].$Attribute -gt $SearchedObject ) -or ($SortedArray[$endIndex].$Attribute -lt $SearchedObject ) ) {
                return "Out of scope!"
            }
            while ($startIndex -le $endIndex) {   
                $middleIndex = $startIndex + [Math]::floor(($endIndex - $startIndex) / 2)
                if ($SortedArray[$middleIndex].$Attribute -eq $SearchedObject) {
                        $Output += $SortedArray[$middleIndex]
                        for ($n=$middleIndex - 1;$SortedArray[$n].$Attribute -eq $SearchedObject;$n--) {
                            $Output += $SortedArray[$n]
                        }
                        for ($n=$middleIndex + 1;$SortedArray[$n].$Attribute -eq $SearchedObject;$n++) {
                            $Output += $SortedArray[$n]
                        }
                }
                if ($SortedArray[$middleIndex].$Attribute -lt $SearchedObject) {
                    $startIndex = $middleIndex + 1
                }
                else {
                    $endIndex = $middleIndex - 1
                }
            }
            return $Output

            }

            Medutim, da bi binary radio, on mora operirati sa sortiranim poljem, a upravo to sortiranje u Powershellu ne radi kako spada:

            UPOTREBA BINARY SEARCH da bi se obogatilo POLJE1 sa podacima iz ADa:

            foreach ($Entry in $POLJE1) {
            $UserEntry = BinarySearch -SortedArray $ADExport -Attribute Mail -SearchedObject $Entry.Email

            AD Export i sortiranje PWS cmdletom "Sort-Object":

            $ADExport = Get-ADUser -Filter 'Mail -like "XXX" -and Enabled -eq "True"' -SearchBase $Path -Properties Mail, extensionAttribute8 | Select-Object SamAccountName, Mail, Name | Sort-Object -Property Mail

            Ono sto meni treba je Quicksort funkcija koja operira nad ADExportom i poslozi po propertyu (kolumni) Mail, ali isto to napravi nad propertyima SamAccountName, Name. Ovo je kako trenutno izgleda moja quicksort funkcija:

            function quicksort($array) {
            $less, $equal, $greater = @(), @(), @()
            if( $array.Count -gt 1 ) {
            $pivot = $array[0]
            foreach( $x in $array) {
            if($x -lt $pivot) { $less += @($x) }
            elseif ($x -eq $pivot) { $equal += @($x)}
            else { $greater += @($x) }
            }
            $array = (@(quicksort $less) + @($equal) + @(quicksort $greater))
            }
            $array
            }

              Pogledam nakon posla danas.

              chono Ok, moram se skoncentrirat, pa ću na codepen ili negdje dići ovo što si napravio, tj barem okvirno.

              chono Problem je upravo to "obogacivanje" POLJA1, gdje koristenje "where-object", "contains" ili bilo cega drugog traje predugo, jer je AD uz sve filtere prevelik i to vrti jako dugo.

              Znači prvi korak je uzeti POLJE1 i proširiti ga podacima koje imaš iz AD-a, po emailu?
              POLJE1 je podatak koji imaš iz jednog sustava, i ono je referenca za podatke ili? Pokušavam povezat taj dio i AD dio. Što iz originalnog POLJE1 mičeš, ili ništa ne mičeš, nego samo tražiš te mailove u AD podacima i kad nađeš, proširiš?
              Jesi razmišljao raditi obrnuto, da AD podatke obradiš? Ako moraš maknuti višak u tom dijelu, da ga makneš? Pretpostavljam da radiš previše loopova na velikom podatku, u ovom slučaju AD podatku, možda je dobro probati obrnuto.

              EDIT:
              https://code.labstack.com/XkU_q8IY

              Projekt (ne znam uopće tko nudi Powershell online emulaciju, pa sam ovo prvo našao). 2 puta na run da izbaci rez dolje 🙂
              Možete početi slagati primjer unutra

                foggy tako je, POLJE1 sadrzi samo email i date, to je export iz jednog sustava. Ja mu onda na te postojece podatke zaljepim SamAccountName i Name iz ADa, kako bi mogao po SamAccountNameu usporediti sa POLJEM2.

                  chono Ok, onda brzinsko pitanje, to što sam te pitao: Zašto AD podatak ne obradiš tako da njemu makneš višak na neki način? Koji bi onda uvjet bio?

                  Podaci:

                  • AD podaci, imaš duplića? Tipa duplih elemenata koji imaju isti email?
                  • POLJE1 neobrađeno, ima li tamo duplih email elemenata?

                  EDIT:
                  https://code.labstack.com/XkU_q8IY
                  Ovako nekako ti izgledaju podaci? Nakucao sam samo stringove i ubacio u array objekata. Jesu ti tak podaci pohranjeni?
                  Ako želite nešto mijenjati, napravite svoj projekt na ovoj domeni da se ne koljemo međusobno.

                  EDIT 2:
                  Vidi jel ti ovo pomaže:

                  `Write-Host 'Hello Chono, lets take you for a ride!'
                  $polje1 = @([pscustomobject]@{email="email1@email.com";date="04/19/2022"},
                  [pscustomobject]@{email="email2@email.com";date="04/18/2022"})
                  $poljeAD = @([pscustomobject]@{date="04/19/2022";SamAccountName='userName1';RealName="Real Name hehehehehehe";Office='Office 1';email='email1@email.com'},
                  [pscustomobject]@{date="04/18/2022";SamAccountName='userName2';RealName="Real Name 2";Office='Office 2';email='email2@email.com'},
                  [pscustomobject]@{date="04/17/2022";SamAccountName='userName3';RealName="Real Name 3";Office='Office 3';email='email3@email.com'})

                  foreach( $elem1 in $polje1 ) {
                  $realNameExp = $poljeAD | Where-Object { $_.email -eq $elem1.email }
                  Write-Host "Expanded data for polje1 $($elem1.email): $($realNameExp)"
                  }`

                    foggy nema duplica u polju1 i u ADu. Email je unikatan. I maknuo sam nepotrebne stvari iz ADa sa filterom da mi izvuce samo realname, samaccountname, mail.

                    Ovo zadnje sto si napravio u foreachu sam napravio i ja, ali to traje predugo kada imas puno podataka.

                      chono Oke, to me zanimalo. Znači ovo je sporiji pristup jer vrti po 1 Where-Object u svakoj iteraciji, mogu si mislit koliko je to podataka... Powershell nije najpametniji vidim. Oke, idući approach, konverzija podatka... Daj mi malo vremena (ak se ne javim do 17h pojeo me posao).

                      Haha, vidi ovog:
                      https://stackoverflow.com/questions/33009695/powershell-where-slow-is-there-a-faster-way-to-search-object

                      Ima tvoj kind of problem 😃

                        foggy nikako nije najpametniji 😂 vidis da moram sam pisati funkciju za sortiranje, jer pws sort metoda ne radi kako treba.

                          chono Ajmo preko hashtable keyeva (poljeAD konverzija objekta u key vrijednost helperpolja - powered by stackoverflow):

                          Write-Host 'Hello Chono, lets take you for a ride!'
                          $polje1 = @([pscustomobject]@{email="email1@email.com";date="04/19/2022";RealName=""},
                          [pscustomobject]@{email="email2@email.com";date="04/18/2022";RealName=""})
                          $poljeAD = @([pscustomobject]@{date="04/19/2022";SamAccountName='userName1';RealName="Real Name hehehehehehe";Office='Office 1';email='email1@email.com'},
                          [pscustomobject]@{date="04/18/2022";SamAccountName='userName2';RealName="Real Name 2";Office='Office 2';email='email2@email.com'},
                          [pscustomobject]@{date="04/17/2022";SamAccountName='userName3';RealName="Real Name 3";Office='Office 3';email='email3@email.com'})
                          
                          $helperPolje = @{}
                          $poljeAD | ForEach-Object {
                            $helperPolje[$_.email] = $_
                            Write-Host $helperPolje[$_.email].email
                          }
                          
                          $polje1 | ForEach-Object {
                            $email = $_.email
                            if($helperPolje.ContainsKey($email)){
                            	Write-Host "Entered the loop"
                              $_.RealName = $helperPolje[$_.email].RealName
                            }
                          }
                          
                          Write-Host "Expanded data for polje1 $($polje1[0].email): $($polje1[0].RealName)" `
                          [URL=https://i.imgur.com/WMEhBuI.png][IMG]https://i.imgur.com/WMEhBuI.png[/IMG][/URL]
                          
                          EDIT (malo bolje napisano, bez da imaš prošireno polje1):
                          `Write-Host 'Hello Chono, lets take you for a ride!'
                          $polje1 = @([pscustomobject]@{email="email1@email.com";date="04/19/2022"},
                          [pscustomobject]@{email="email2@email.com";date="04/18/2022"})
                          $poljeAD = @([pscustomobject]@{date="04/19/2022";SamAccountName='userName1';RealName="Real Name hehehehehehe";Office='Office 1';email='email1@email.com'},
                          [pscustomobject]@{date="04/18/2022";SamAccountName='userName2';RealName="Real Name 2";Office='Office 2';email='email2@email.com'},
                          [pscustomobject]@{date="04/17/2022";SamAccountName='userName3';RealName="Real Name 3";Office='Office 3';email='email3@email.com'})
                          
                          $helperPolje = @{}
                          $poljeAD | ForEach-Object {
                            $helperPolje[$_.email] = $_
                          }
                          
                          $polje1 | ForEach-Object {
                            $email = $_.email
                            if($helperPolje.ContainsKey($email)){
                            	Write-Host "Entered the loop"
                              $_ | Add-Member -MemberType NoteProperty -Name 'RealName' -Value $helperPolje[$_.email].RealName
                            }
                          }
                          
                          Write-Host "Expanded data for polje1 $($polje1[0].email): $($polje1[0].RealName)"

                          Probaj na pravim podacima ako nisi pa javiš (pazi samo, ovaj forumski editor mi je maknuo sve underscore znakove, tam gdje je italik išao je underscore prije tog dijela)...

                            foggy tek sad vidim 😁 da, uspio sam temporary poljem, ali nisam zadovoljan brzinom izvedbe, jer radi vrlo slicno vremenski kao bez binary searcha.
                            Stvarno cu morati nekako napisati quicksort koji sadrzi parametar polje i sve kolumne koje polje sadrzi