Jump to content

Infinite Loop For Next when Deleting Array Elements


Go to solution Solved by souldjer777,

Recommended Posts

Good Morning AutoIT Gurus and Masters :sorcerer:

Slightly complicated array here... and infinite loop that I'm trying to output to a file after the values are matched up; then anything that doesn't match is deleted from the array and finally written to a file...

This guy does an infinite loop... and I'm not sure why... I tried to put in message boxes - but there are 20K records so I couldn't click through that many. LOL.

#RequireAdmin
#include <array.au3>
#include <file.au3>
#include <Excel.au3>
#include <MsgBoxConstants.au3>

Global $WXYZArray01, $array01, $ProgramTitle, $sleeptime, $k01

$ProgramTitle = "Testing 1 2 3"

$sleeptime = 1000

_FileReadToArray(@ScriptDir & "\" & "testing_output_csv_unique_values.csv", $array01, "", ",")

;_ArrayDisplay ($array01, "Array01")

$aUniqueHostname = _ArrayUnique ($array01, 1)

;_ArrayDisplay ($aUniqueHostname, "UniqueHostname ")

For $i01 = Ubound($aUniqueHostname) - 1 to 0 Step - 1
    For $j01 = Ubound($array01) - 1 to 0 Step - 1
        If $array01[$j01][1] == $aUniqueHostname[$i01] and StringRegExp($array01[$j01][5], "MY_VALUE") then
            MsgBox(0, "Computer and MY_VALUE",  $aUniqueHostname[$i01] & " : " & $array01[$j01][5])
            $FileName01 = @ScriptDir & "\" & $array01[$j01][3] & "_" & $aUniqueHostname[$i01] & "_" & $array01[$j01][2] & ".csv"
             MsgBox(0, "File Name", $FileName01)
                $WXYZArray01 = $array01
                _ArrayDisplay ($WXYZArray01, "WXYZ Array")
                SplashTextOn($ProgramTitle, 'Generic - Please wait for loop to complete...', 400, 40, -1, -1, 2, "", 10)
                Sleep ($sleeptime)
                For $k01 = 0 To Ubound($WXYZArray01) - 1
                    ; MsgBox (0, "In the WXYZ loop", $WXYZArray01[$k01][1] & " : " & $aUniqueHostname[$i01])
                    If $WXYZArray01[$k01][1] <> $aUniqueHostname[$i01] Then
                        ;MsgBox (0, "In the WXYZ loop - Delete", $WXYZArray01[$k01][1] & " : " & $aUniqueHostname[$i01])
                    _ArrayDelete($WXYZArray01, $k01)
                    ;_ArrayDisplay ($WXYZArray01)
                    $k01 -= 1
                    EndIf
                    If $k01 = UBound($WXYZArray01) - 1 Then ExitLoop
                Next
                SplashOff()
                MsgBox (0, "Out of the WXYZ loop", "Out of the WXYZ loop - File Write From Array")
                _FileWriteFromArray($FileName01, $WXYZArray01, 1)
            ExitLoop
        EndIf
    Next
Next

I'm hoping someone here can tell me why at a glance... I'm a little burned out to see the answer... feeling toasty :) LOL  :idea:

Thank you everyone for your help!

:thumbsup:

 

Edited by souldjer777

"Maybe I'm on a road that ain't been paved yet. And maybe I see a sign that ain't been made yet"
Song Title: I guess you could say
Artist: Middle Class Rut

Link to comment
Share on other sites

I'd guess this section might do it.

If $WXYZArray01[$k01][1] <> $aUniqueHostname[$i01] Then
    ;MsgBox (0, "In the WXYZ loop - Delete", $WXYZArray01[$k01][1] & " : " & $aUniqueHostname[$i01])
    _ArrayDelete($WXYZArray01, $k01)
    ;_ArrayDisplay ($WXYZArray01)
    $k01 -= 1 ; <<<<<<<<<<<<<<<<<<<<<<<<<<
EndIf

Every time you don't find a match, you're essentially restarting the loop, or at least making it run longer.

If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.
Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag Gude
How to ask questions the smart way!

I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from.

Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays.  -  ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script.  -  Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label.  -  _FileGetProperty - Retrieve the properties of a file  -  SciTE Toolbar - A toolbar demo for use with the SciTE editor  -  GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI.  -   Latin Square password generator

Link to comment
Share on other sites

Thank you BrewManNH,

I'm trying to get a grasp on what's going on here... it seems stuck, like in an infinite loop still... I don't know where either...

For $i01 = Ubound($aUniqueHostname) - 1 to 0 Step - 1
    For $j01 = Ubound($array01) - 1 to 0 Step - 1
        If $array01[$j01][1] == $aUniqueHostname[$i01] and StringRegExp($array01[$j01][5], "MY_VALUE") then
            MsgBox(0, "Computer and MY_VALUE",  $aUniqueHostname[$i01] & " : " & $array01[$j01][5])
            $FileName01 = @ScriptDir & "\" & $array01[$j01][3] & "_" & $aUniqueHostname[$i01] & "_" & $array01[$j01][2] & ".csv"
             MsgBox(0, "File Name", $FileName01)
                $WXYZArray01 = $array01
                ;_ArrayDisplay ($WXYZArray01, "WXYZ Array")
                SplashTextOn($ProgramTitle, 'Generic - Please wait for loop to complete...', 400, 40, -1, -1, 2, "", 10)
                Sleep ($sleeptime)
                For $k01 = Ubound($WXYZArray01) - 1 to 0 Step - 1


                    ;MsgBox (0, "In the WXYZ loop", $WXYZArray01[$k01][1] & " : " & $aUniqueHostname[$i01])
                    If $WXYZArray01[$k01][1] <> $aUniqueHostname[$i01] Then
                        ;MsgBox (0, "In the WXYZ loop - Delete", $WXYZArray01[$k01][1] & " : " & $aUniqueHostname[$i01])
                    _ArrayDelete($WXYZArray01, $k01)
                    ;_ArrayDisplay ($WXYZArray01)
                    Else
                    EndIf
                    ;_ArrayDisplay ($WXYZArray01)
                Next
                SplashOff()
                MsgBox (0, "Out of the loop", "Out of the loop - File Write From Array")
                _FileWriteFromArray($FileName01, $WXYZArray01, 1)

            ExitLoop
        EndIf
    Next
Next

I'll keep plugging away, but thank you for your input!

Edited by souldjer777

"Maybe I'm on a road that ain't been paved yet. And maybe I see a sign that ain't been made yet"
Song Title: I guess you could say
Artist: Middle Class Rut

Link to comment
Share on other sites

  • Solution

If found the answer thanks to an answer given to me 3 years earlier by czardas - Many thanks czardas . I didn't realize the extent of your answer then, but I understand it today. Thank you.

#RequireAdmin
#include <array.au3>
#include <file.au3>
#include <Excel.au3>
#include <MsgBoxConstants.au3>

Global $WXYZArray01, $array01, $ProgramTitle, $sleeptime, $k01, $aExtract, $aArray

$ProgramTitle = "Testing 1 2 3"

$sleeptime = 1000

_FileReadToArray(@ScriptDir & "\" & "testing_output_csv_unique_values.csv", $array01, "", ",")

;_ArrayDisplay ($array01, "Array01")

$aUniqueHostname = _ArrayUnique ($array01, 1)

;_ArrayDisplay ($aUniqueHostname, "UniqueHostname ")

For $i01 = Ubound($aUniqueHostname) - 1 to 0 Step - 1
    For $j01 = Ubound($array01) - 1 to 0 Step - 1
        If $array01[$j01][1] == $aUniqueHostname[$i01] and StringRegExp($array01[$j01][5], "MY_OTHER_VALUE") then
            MsgBox(0, "Computer and MY_OTHER_VALUE",  $aUniqueHostname[$i01] & " : " & $array01[$j01][5])
            $FileName01 = @ScriptDir & "\" & $array01[$j01][3] & "_" & $aUniqueHostname[$i01] & "_" & $array01[$j01][2] & ".csv"
             MsgBox(0, "File Name", $FileName01)

                SplashTextOn($ProgramTitle, 'Generic - Please wait for loop to complete...', 400, 40, -1, -1, 2, "", 10)
                Sleep ($sleeptime)

                Local $avResult = _ArrayFindAll($array01, $aUniqueHostname[$i01], 0, 0, 0, 0, 1)
                _ArrayDisplay($avResult, "$avResult")
                Local $aNewArray[UBound($avResult)][UBound($array01, 2)]

                    For $i = 0 To UBound($avResult) -1 ; Loop through the returned index numbers.
                        For $j = 0 To UBound($array01, 2) -1 ; Loop through each of the columns.
                            $aNewArray[$i][$j] = $array01 [$avResult[$i]] [$j] ; Populate the new array.
                        Next
                    Next

                SplashOff()
                MsgBox (0, "Out of the loop", "Out of the loop - File Write From Array")
                _FileWriteFromArray($FileName01, $aNewArray, 1)

            ExitLoop
        EndIf
    Next
Next

:thumbsup:  :sorcerer:czardas  :king:  :thumbsup:  ... and yes, I'm kinda ridonkulus about emoticons LOL

"Maybe I'm on a road that ain't been paved yet. And maybe I see a sign that ain't been made yet"
Song Title: I guess you could say
Artist: Middle Class Rut

Link to comment
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
 Share

×
×
  • Create New...