Jump to content
Sign in to follow this  
yhu420

[SOLVED]Count duplicates in an array

Recommended Posts

Hello everyone,

I just have a beginner question: is there a way to count duplicates in an array? If you don't see what I mean, here is an example of what I mean:

$arr[5] = ['a', 'a', 'b', 'b', 'c'] ; the array

countDuplicates($arr); Representing the data in a bidimensionnal array, this would return:

#cs
['a'][2]
['b'][2]
['c'][1]

Of course this is a bit messy, but that's just for you to get the idea
#ce

I'm trying to achieve this to check whether yes or no an array has more or same amount of occurrences of a character than another array.

Am I doing this the right way?

Does such a function exist?

Thanks for everything :)

Spoiler
Spoiler

 

Edited by yhu420
added solved tag

Share this post


Link to post
Share on other sites

There is no func (@Dev's please correct when wrong) to this job. But you can solve like this:

#include <Array.au3>

$txt = ""
For $i=0 to 100
    $txt &= Random(1,30,1)&@CRLF
Next



;$txt = FileRead('test.txt') ;if txt is ia in a file

;startpoint
;ConsoleWrite($txt & @CRLF)
_ArrayDisplay(_countUniqueNumbers($txt), '_countUniqueNumbers')

Func _countUniqueNumbers($sText='Test', $sDelim=@CRLF)
    ;ConsoleWrite($sText & @CRLF)
    ;returns the count of each unique number in a String
    ;autor: autobert (autoit.de) 11/2009
    $sText = @CRLF&StringReplace($sText, ' ', '')
    $sText = StringReplace($sText, $sDelim, $sDelim & ' ')
    $aSource = StringSplit($sText, $sDelim, 3)
    _ArrayDelete($aSource, 0)
    ;_ArrayDisplay($aSource,'Original')
    $aUnique = _ArrayUnique($aSource)
    _ArrayDelete($aUnique, 0)
    Dim $aUnique2D[UBound($aUnique)][2]
    For $x = UBound($aUnique) - 1 To 0 Step -1
        $aUnique2D[$x][0] = $aUnique[$x]
        StringReplace($sText, $aUnique[$x] & $sDelim, 'a')
        $aUnique2D[$x][1] = @extended
        If StringStripWS($aUnique2D[$x][0],8)='' Then _ArrayDelete($aUnique2D,$x)
    Next
    _ArraySort($aUnique2D)
    Return $aUnique2D
EndFunc   ;==>_countUniqueNumbers

 

Share this post


Link to post
Share on other sites

Try this :

#Include <Array.au3>

Local $arr = ['a', 'a', 'b', 'b', 'c', 'e', 'f', 'a'] 
Local $aDup = _ArrayCountOcc($arr, 2)
_ArrayDisplay($aDup)

; iOrdByNumber = 0 : Do not sort
;                1 : Sort by number of occurences
;                2 : Sort by number of occurences, in descending order
Func _ArrayCountOcc($aArray, $iOrdByNumber = 0)
    If UBound($aArray, 0) <> 1 Then Return SetError(1, 0, 0)
    If Not IsInt($iOrdByNumber) Or $iOrdByNumber < 0 Or $iOrdByNumber > 2 Then Return SetError(2, 0, 0)
    Local $aRet[UBound($aArray)][2], $last, $iIndex = 0
    _ArraySort($aArray)
    For $i = 0 To UBound($aArray) - 1
        If $aArray[$i] = $last And $i <> 0 Then
            $aRet[$iIndex - 1][1] += 1
        Else
            $aRet[$iIndex][0] = $aArray[$i]
            $aRet[$iIndex][1] = 1
            $last = $aArray[$i]
            $iIndex += 1
        EndIf
    Next
    Redim $aRet[$iIndex][2]
    If $iOrdByNumber Then _ArraySort($aRet, ($iOrdByNumber = 2 ? 1 : 0), 0, 0, 1)
    Return $aRet
EndFunc

 

Edited by jguinch

Share this post


Link to post
Share on other sites

Sorry first example was to count in text, this one is for counting in array:

#include <Array.au3>

#cs
Dim $aArray[101]
For $i=0 to 100
    $aArray[$i] = Random(1,30,1)
Next
#ce
Local $aArray[5]    = ["a", "a", "b", "b", "c"]
_ArrayDisplay(_countUniqueElements($aArray), '_countUniqueElements')

Func _countUniqueElements($aSource)
    ;returns the count of each unique element in a Array
    ;autor: autobert
    Local $aUnique = _ArrayUnique($aSource)
    _ArrayDelete($aUnique, 0)   
    Dim $aUnique2D[UBound($aUnique)][2]
    For $x = 0 to UBound($aUnique) - 1 
        $aUnique2D[$x][0] = $aUnique[$x]
        $aCount=_ArrayFindAll($aSource,$aUnique[$x])
        $aUnique2D[$x][1] = UBound($aCount)
    Next
    _ArraySort($aUnique2D)
    Return $aUnique2D
EndFunc   ;==>_countUniqueElements^

 

Share this post


Link to post
Share on other sites
#include<array.au3>

Local $aArray[8]    = ["a", "a", "b", "b", "c" , "c" , "c" , "d"]

Local $aOut[0][2]

for $i = ubound($aArray) - 1 to 0 step -1
        $aFound = _ArrayFindAll($aArray , $aArray[$i])
        _ArrayAdd($aOut , $aArray[$aFound[0]] & "|" & ubound($aFound) ,  0)
        _ArrayDelete($aArray , _ArrayToString($aFound , ";"))
        $i -= ubound($aFound) - 1
next

_ArrayDisplay($aOut)

 


,-. .--. ________ .-. .-. ,---. ,-. .-. .-. .-.
|(| / /\ \ |\ /| |__ __||| | | || .-' | |/ / \ \_/ )/
(_) / /__\ \ |(\ / | )| | | `-' | | `-. | | / __ \ (_)
| | | __ | (_)\/ | (_) | | .-. | | .-' | | \ |__| ) (
| | | | |)| | \ / | | | | | |)| | `--. | |) \ | |
`-' |_| (_) | |\/| | `-' /( (_)/( __.' |((_)-' /(_|
'-' '-' (__) (__) (_) (__)

Share this post


Link to post
Share on other sites

First of all, sorry for the late reply.

Thanks to all of you who answered, I feel sorry for posting a duplicate thread, but I hope I will help out people asking the same question.

Special thanks to iamtheky, his solution seemed the most effective and everything indeed works fine :D

Thanks again to all of you for helping me out!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By Automania
      Hi all,
      I haven't used AutoIt in more than 10 years and I am sure a lot has improved since that long time. I hope you can give me some suggestions on my approach.
      Task: I need to extract user data (for around 1700 users) from a website tool. That tool shows an output in a table on the website. However, no export feature is available and I need the data in an Excel file, such as:
      username, serial number (of a laptop), ID number (of laptop) and some more
       
      With my knowledge from 2009 I would do this:
      1) use _IEextract with each username in the url to get the whole source code of the website with the user's data summary
      2) Work with lots of regexpressions to extract each data piece, save them into variables/array
      3) Write variable values into an Excel file
      4) rinse repeat 1700 times
       
      The relevant line for step 3 looks like this:
      <td class="resultcell"><span class="new">2021-03-23 11:05:00</span></td><td class="resultcell">Hostname-1234</td><td class="resultcell"><a href="?&Search=Search&result=summarized%20history&field=serial%20numbers&criteria=123456">123456</a></td><td class="resultcell">0987654/td><td class="resultcell"><a href="?&Search=Search&result=summarized%20history&field=usernames&criteria=myusername">myusername</a> and so on.. so here it would be Hostname-1234, 0987654 and myusername that I would need to extract.

      Although this may work it does not appear very efficient and would take a while. So I am happy for an alternate approach. Preferably, without using additional exe binary files due to company policies besides AutoIt itself.
    • By Hermes
      My _Excel_RangeCopyPaste is not working as intended. What I am trying to accomplish is copy the range B:E using _Excel_RangeCopyPaste in the first row and repeat the same for row 2 and so on.
      ;Skip from reading header columns Local $Skipline = 0 ;0==> first line Local $temprf For $i = 0 To UBound($aArray2) - 1 If $Skipline = $i Then ContinueLoop $temprf &= $aArray2[$i] _Excel_RangeCopyPaste($oWorkbook.Activesheet, $oRange) Local $oTest = _WD_FindElement($sSession, $_WD_LOCATOR_ByCSSSelector, "PasteButton") ;This button will paste values from the Clipboard once clicked _WD_ElementAction($sSession, $oTest, 'click')) Next Here's the full code:
      #Include <Chrome.au3> #Include <wd_core.au3> #Include <wd_helper.au3> #Include <WinHttp.au3> #include <MsgBoxConstants.au3> #include <IE.au3> #include <Array.au3> #include <Excel.au3> Local $sDesiredCapabilities, $sSession SetupChrome() _WD_Startup() $sSession = _WD_CreateSession($sDesiredCapabilities) _WD_LoadWait($sSession) _WD_Navigate($sSession, "test.html") Local $oAppl = _Excel_Open() Local $sWorkbook = "test.xlsx" Local $oWorkbook = _Excel_BookOpen($oAppl, $sWorkbook) ;open excel and pass both parameters Local $aArray2 = _Excel_RangeRead($oWorkbook,Default,$oWorkbook.ActiveSheet.Usedrange.Columns("A:A")) Local $oRange = $oWorkbook.ActiveSheet.Range("B:E") ;Skip from reading header columns Local $Skipline = 0 ;0==> first line Local $temprf For $i = 0 To UBound($aArray2) - 1 If $Skipline = $i Then ContinueLoop $temprf &= $aArray2[$i] _Excel_RangeCopyPaste($oWorkbook.Activesheet, $oRange) Local $oTest = _WD_FindElement($sSession, $_WD_LOCATOR_ByCSSSelector, "PasteButton") ;This button will paste values from the Clipboard once clicked _WD_ElementAction($sSession, $oTest, 'click')) Next _WD_Shutdown() Func SetupChrome() _WD_Option('Driver', 'chromedriver.exe') _WD_Option('Port', 9515) _WD_Option('DriverParams', '--log-path="' & @ScriptDir & '\chrome.log"') Return '{"capabilities":{"alwaysMatch":{"goog:chromeOptions":{"w3c":true,' & _ '"excludeSwitches":["enable-automation"],"useAutomationExtension":false}}}}' EndFunc ;==>SetupChrome For the first row I am trying to copy just B:E with the following info
      Apple Banana Orange Mango and then repeat for row 2, row 3, etc. I've attached the spreadhseet.
      test.xlsxI have also attached the excel file for reference.
    • By Hermes
      I have an html table that displays data along with an excel spreadsheet that has the same data as the html table. I am wanting to only match the Title column in my html table with the Title column in my Excel spreadsheet. If the titles match, click on the Edit hyperlink and continue to loop to next row. The issue I'm experience is its not matching correctly. So far  i've written the codes below:
      <table border="1" class="test"> <tr> <th> UniqueID</th> <th> Title</th> <th> UserID</th> <th> Address</th> <th> Gender </th> </tr> <tr> <td> 1 </td> <td> Title1 </td> <td> 12345 </td> <td> Manila </td> <td> <span> Male </span> </td> </tr> <tr> <td align="center" colspan="5"> <a href="#" class="testlink">Edit</a> </td> </tr> <tr> <td> 2 </td> <td> Title2 </td> <td> 67891 </td> <td> Valenzuela </td> <td> <span> Female </span> </td> </tr> <tr> <td align="center" colspan="5" > <a href="#" class="testlink">Edit</a> </td> </tr> <tr> <td> 3 </td> <td> Title3 </td> <td> 88888 </td> <td> Ohio </td> <td> <span> Male </span> </td> </tr> <tr> <td align="center" colspan="5" > <a href="#" class="testlink">Edit</a> </td> </tr> <tr> <td> 4 </td> <td> Title4 </td> <td> 77777 </td> <td> California </td> <td> <span> Female </span> </td> </tr> <tr> <td align="center" colspan="5" > <a href="#" class="testlink">Edit</a> </td> </tr> <tr> <td> 5 </td> <td> Title5 </td> <td> 33333 </td> <td> Arizona </td> <td> <span> Male </span> </td> </tr> <tr> <td align="center" colspan="5" > <a href="#" class="testlink">Edit</a> </td> </tr> </table> #Include "Chrome.au3" #Include "wd_core.au3" #Include "wd_helper.au3" #Include "Excel.au3" #Include "_HtmlTable2Array.au3" #Include "Array.au3" Local $sDesiredCapabilities, $sSession SetupChrome() _WD_Startup() $sSession = _WD_CreateSession($sDesiredCapabilities) _WD_LoadWait($sSession) _WD_Navigate($sSession, "index.html") Sleep(6000) Local $oExcel = _Excel_Open() Local $oWorkbook = _Excel_BookOpen($oExcel, "test.xlsx") ; Get the table element $sElement = _WD_FindElement($sSession, $_WD_LOCATOR_ByXPath, "//table[@class='test']") ; Retrieve HTML $sHTML = _WD_ElementAction($sSession, $sElement, "Property", "outerHTML") ;Local $aTable = _HtmlTableGetWriteToArray($sHTML) Local $aArray1 = _Excel_RangeRead($oWorkbook,1,$oWorkbook.ActiveSheet.Usedrange.Columns("B:B")) Local $aArray2 = _HtmlTableGetWriteToArray($sHTML) ;_ArrayDisplay($aArray1) ;_ArrayDisplay($aArray2) For $i = UBound($aArray1) - 1 To 0 step - 1 For $j = UBound($aArray2) - 1 to 0 step - 1 If $aArray1[$i][1] == $aArray2[$j][1] Then _WD_WaitElement($sSession, $_WD_LOCATOR_ByXPath, "//a[contains(@class,'testlink') or contains(text(),'Edit')]") $test1 = _WD_FindElement($sSession, $_WD_LOCATOR_ByXPath, "//a[contains(@class,'testlink') or contains(text(),'Edit')]") _WD_ElementAction($sSession, $test1, 'click') ;_ArrayDisplay($aArray1) ;_ArrayDelete($aArray1 , $i) ;exitloop EndIf Next Next _WD_Shutdown() Func SetupChrome() _WD_Option('Driver', 'chromedriver.exe') _WD_Option('Port', 9515) _WD_Option('DriverParams', '--log-path="' & @ScriptDir & '\chrome.log"') $sDesiredCapabilities = '{"capabilities": {"alwaysMatch": {"goog:chromeOptions": {"w3c": true, "args":["start-maximized","disable-infobars"]}}}}' EndFunc ;==>SetupChrome Would appreciate if anyone can provide tips, or point me in the right direction in doing it.
       
      test.xlsx
    • By SEuBo
      Hi!
      I am just getting started with C and C++. I have created a pretty simple C code which is calling a dll function.
      When I compile and run, I get the appropriate Output. So it works fine.

       
      Now I would want to transform that to AutoIt. -> I would like to call the "RfcOpenConnection" function from AutoIt - but whatever I try with DLLCall, I can not get it to work. 
      Can someone point me in the right direction? DLL, C Sourcecode and compiled exe are attached too large to be attached, so they're uploaded here: 
      https://drive.google.com/file/d/12CUSsISl0mojiMCNxKjps1Sdoox3JlCX/view?usp=sharing
       
      Thanks a bunch!
    • By goku200
      I'm having some issues with writing to column C when an element is found. It works on C2 but it does not continue to C3, C4, C5, etc..... I'm wanting to write "test" if the element //input[@id='username'] is found  $someUser = _WD_FindElement($sSession, $_WD_LOCATOR_ByXPath, "//input[@id='username']"). I have attached my HTML and Excel file along with my AutoIt code below:
      #Include "wd_core.au3" #Include "wd_helper.au3" #Include "wd_core.au3" #Include "File.au3" #Include "Array.au3" #Include "Excel.au3" Local $sDesiredCapabilities, $sSession _WD_Startup() $Ssession = _WD_CreateSession($sDesiredCapabilities) _WD_Navigate($sSession, "https://127.0.0.1/test.html") _WD_LoadWait($sSession) Local $oExcel = _Excel_Open() Local $oWorkbook = _Excel_BookOpen($oExcel, "C:\Users\<Username>\Downloads\test.xlsx") Local $aArrayTest1 = _Excel_RangeRead($oWorkbook, 1, $oWorkbook.ActiveSheet.Usedrange.Columns("A:A")) Local $aArrayTest2 = _Excel_RangeRead($oWorkbook, 1, $oWorkbook.ActiveSheet.Usedrange.Columns("B:B")) For $i = 0 To UBound($aArrayTest1) - 1 _WD_Navigate($Ssession, $aArrayTest1[$i]) _WD_LoadWait($sSession) $someUser = _WD_FindElement($sSession, $_WD_LOCATOR_ByXPath, "//input[@id='username']") _WD_SetElementValue($sSession, $someUser, $aArrayTest2[$i]) Local $sElement = _WD_FindElement($sSession, $_WD_LOCATOR_ByXPath, "//input[@type='submit'][@value='Submit']") _WD_ElementAction($sSession, $sElement, 'click') _WD_LoadWait($sSession) Sleep(5000) If $someUser Then Local $aArray2D[2] = ["test"] _Excel_RangeWrite($oWorkbook, $oWorkbook.ActiveSheet, $aArray2D, "C2") EndIf Next Func SetupChrome() _WD_Option('Driver', 'chromedriver.exe') _WD_Option('Port', 9515) _WD_Option('DriverParams', '--log-path="' & @ScriptDir & '\chrome.log"') $sDesiredCapabilities = '{"capabilities": {"alwaysMatch": {"goog:chromeOptions": {"w3c": true, "args":["start-maximized","disable-infobars"]}}}}' EndFunc ;==>SetupChrome  
      test.html test.xlsx
×
×
  • Create New...