Jump to content
Reizvoller

BIG String to Array

Recommended Posts

Reizvoller

Greetings,

I am getting the "RawData" return from FastFind's "FFGetRawData" function and then attempting to make it into an array.

What I have here does the job as it should but it is a slow process. I feel I may be overlooking a more effecient way to handle this matter. In the end ( in an ideal situation ) I'd like to end up with a 2D array with 580 col and 375 rows. Currently it's just a 1D array as I am still trying to get my head around how to make it into a 2D. BUT... My question is this ...

Is there a better way to handle what I am trying to do? 

Func trimmer ()
    Local $i = 0 ;The "Counter"
    Local $WorkAreaLength = StringLen ($WorkAreaData) ;Get the length of the string
    ConsoleWrite ("WorkAreaLegnth="&$WorkAreaLength&@CR)
    Local $iWorkAreaLengthCount = $WorkAreaLength / 8 ;How many segments of 8 can we make? Use this for the counter later on
    ConsoleWrite ("WorkArealengthCount="&$iWorkAreaLengthCount&@CR) 
    Local $sPiece = 0 ; The string segment holder
    Global $aWorkArea ; The array to write to
        Do
            $sPiece = StringLeft ($WorkAreaData, 8) ; Grab the first 8 characters and put them into $sPiece
            _ArrayAdd ($aWorkArea, $sPiece) ; Put what $sPiece is into the array
            StringTrimLeft ($WorkAreaData, 8) ;Trim off the first 8 characters that were just copied

            $i = $i + 1 ;Count up 1
            ConsoleWrite ($i&@CR)
        Until $i >= $iWorkAreaLengthCount ; Keep going until $i >= $iWorkAreaLengthCount

    ConsoleWrite ("Done"&@CR)
    Local $sFile = FileOpen ("main.txt");Open the text file
    _FileWriteFromArray ($sFile , $aWorkArea);Write the array to the text file
    FileClose ($sFile); Close the text file
EndFunc

 

A little secondary problem, that isn't throwing any errors to speak of, is the file is never written to. It remains blank even though it is in the same directory as the script and the script isn't responding with any errors. This isn't my main focus though as it just lets me see what the array is rather than using the console which can be a little cramped at times.

Any advise would be appreciated, thank you!

Share this post


Link to post
Share on other sites
alien4u
$sPiece = StringLeft ($WorkAreaData, +8)

Hi @Reizvoller

I don't know how BIG could be your string but sometimes we just over complicate things.

Like I see it to save your string to an Array 1D or 2D you need to split that string, or you need some kind of delimiter.
So you split your string on segments of 8 character each one, because you don't have any other way to split your string? no delimiters? spaces? anything?

Anyways in order to make this more efficient what I would probably do is to avoid another string operation:

StringTrimLeft ($WorkAreaData, 8)

Try to avoid this operation, maybe if you sum first position to second one?

$sPiece = StringLeft ($WorkAreaData, 8)

Maybe If $i >= 1 Then

$sPiece = StringLeft ($WorkAreaData, +8)

I mean increment StringLeft position by 8 because is always your increment factor, on each loop cicle you could save next StringLeft left position and use that.

I thinks avoiding StringTrimLeft will give you better performance.

Kind Regards
Alien.

Share this post


Link to post
Share on other sites
Reizvoller

Greetings,

Fantastic idea regarding not doing the "StringTrim" and the subsequent +8 on the StringLeft.

Truth be told I am starting to feel like I am attempting to do something I shouldn't.

The string is a bunch of Hexadecimal color values all in a line without any spaces further than a "00" but some colors have "00" in them hence me not using it as a delimiter for this process.

The string is a bit over 1.7million characters which is off of about 217500 pixel values.

This process is to hunt through a work area, see if there is something, then continue along.

After putting more thought into it I feel I need to find another method to tackle my goal but this was great learning along the way! :)

Share this post


Link to post
Share on other sites
alien4u

Anyways if this are Hexadecimal color values always with a fixed length for example 4 characters you could take a high multiple of 4.

For example 400 this will make each array element store 100 colors values and this will make the arrays also shorten for parsing in the next stage of your code.

Kind Regards
Alien.

Share this post


Link to post
Share on other sites
czardas

Perhaps this helps:

#include <Array.au3>
Local $aArray = _StringEqualSplit("12345678910123456789101234567890", 8)
_ArrayDisplay($aArray)

Func _StringEqualSplit($sString, $iNumChars)
    If Not IsString($sString) Or $sString = "" Then Return SetError(1, 0, 0)
    If Not IsInt($iNumChars) Or $iNumChars < 1 Then Return SetError(2, 0, 0)
    Return StringRegExp($sString, "(?s).{1," & $iNumChars & "}", 3)
EndFunc

 

Edited by czardas

Share this post


Link to post
Share on other sites
markyrocks

$file=fileopen ("file.txt",1)

 

Your file is opening in read only mode

 

Edit.  I believe you could use 0x as delimiter then just add it back later

2d array simple example 

Dim $array[10][10]

For $col=0 to ubound($array,2)-1
For $row=0 to ubound($array1)-1
$array[$row][$col]
MsgBox("","", $$array[$row][$col])
;this basically just shuffle through the array and display the results

Next
Next

 

Edited by markyrocks
made a mistake

Share this post


Link to post
Share on other sites
AutoBert

This funcs do the job:

Func _FFArrayFromRawData($String, $iRows = 0, $iCols = 0)
    #cs
        _FFArrayFromRawData($String, [$iRows = 0, [$iCols = 0]])
        Params:     $String     the String with raw pixel data as returned from _FFArrayFromRawData
        $iRows      number of Rows in resulting array OPTIONAL
        $iCols      number of Cols in resulting array OPTIONAL
        possible
        Returns:    $aResult[$iPixelCount+1]    $iRows and $iCols = 0
        so all Pixels in a 1D array
        $aResult[$iRows]            1D array
        $aResult[$iRows][$iCols]    2D array
        also
        setting:    @Error      (0 no error, 1 error occured)
        @extended   10 no valid RawDataString
        11 Arraydimensions to big
        1 Array is 1D (info only)
        2 Array is 2D (info only)

        Author:     HarryBotter 2016
    #ce
    Local $aResult[0], $iPixNo, $iEx
    Local $iLen = StringLen($String)
    If Mod($iLen, 8) Then ;no valid RawDataString
        SetError(1, 10)
        Return
    EndIf
    If $iRows * $iCols * 8 > $iLen Then ;Arraydimensions to big
        SetError(1, 11)
        Return
    EndIf
    If $iRows = 0 And $iCols = 0 Then
        $iRows = $iLen / 8
        ReDim $aResult[$iRows]
        $iEx = 1
    Else
        If $iCols = 0 Then
            ReDim $aResult[$iRows]
            $iEx = 1
        Else
            ReDim $aResult[$iRows][$iCols]

            $iEx = 2
        EndIf
    EndIf
    For $i = 0 To $iRows - 1
        If $iEx > 1 Then
            For $j = 0 To $iCols - 1
                $iPixNo = $i * $iCols + $j
                $aResult[$i][$j] = _FFGetPixelColor($iPixNo, $String)
            Next
        Else
            $aResult[$i] = _FFGetPixelColor($i, $String)
        EndIf
    Next
    SetError(0, $iEx, $aResult)
    Return $aResult
EndFunc   ;==>_FFArrayFromRawData

Func _FFGetPixelColor($iPixNo, $String)
    #cs
        Params:     $iPixNo     the number of Pixel for wich the color is extracted
        $String     the String with raw pixel data as returned from _FFArrayFromRawData

        Remarks:    no Errorhandling only for using together with _FFArrayFromRawData

        Author:     HarryBotter 2016
    #ce
    Local $sRet = StringMid($String, $iPixNo * 8 + 1, 8)
    ;ConsoleWrite($iPixNo & ': ' & $sRet & @CRLF)
    Return $sRet
EndFunc   ;==>_FFGetPixelColor

i already posted you the link to script using this:

#include "FastFind.au3"
#include <Array.au3>

$tdStart = TimerInit()
FFSnapShot(1, 1, 100, 100, 1)
ConsoleWrite('SnapShot after '&TimerDiff($tdStart)&' ms returned with: '  & @error & @CRLF)
Local $sData = FFGetRawData(1)
ConsoleWrite('GetRawData: ' & @error & @CRLF)
Local $aPixels = _FFArrayFromRawData($sData, 100, 100)
If @extended=2 Then
    $iPixelCount=UBound($aPixels,1)*UBound($aPixels,1)
Else
    $iPixelCount=UBound($aPixels)
EndIf

ConsoleWrite('ArrayFromRawData: ' & @error & @TAB & @extended & @TAB & TimerDiff($tdStart) & ' ms'& @CRLF)
ConsoleWrite('Average Time: ' & TimerDiff($tdStart) / $iPixelCount &'ms Pixels: ' & $iPixelCount & @CRLF)
_ArrayDisplay($aPixels)

Without the _ArrayDisplay its very fast. Using smaller workarea will save absolut time.

Edited by AutoBert

Share this post


Link to post
Share on other sites
Reizvoller
3 hours ago, alien4u said:

Anyways if this are Hexadecimal color values always with a fixed length for example 4 characters you could take a high multiple of 4.

For example 400 this will make each array element store 100 colors values and this will make the arrays also shorten for parsing in the next stage of your code.

Kind Regards
Alien.

Shortening them would indeed be handy!

3 hours ago, czardas said:

Perhaps this helps:

#include <Array.au3>
Local $aArray = _StringEqualSplit("12345678910123456789101234567890", 8)
_ArrayDisplay($aArray)

Func _StringEqualSplit($sString, $iNumChars)
    If Not IsString($sString) Or $sString = "" Then Return SetError(1, 0, 0)
    If Not IsInt($iNumChars) Or $iNumChars < 1 Then Return SetError(2, 0, 0)
    Return StringRegExp($sString, "(?s).{1," & $iNumChars & "}", 3)
EndFunc

 

This is an interesting approach! I am going to try it right away, even if it is just for the learning experience :)

2 hours ago, markyrocks said:

$file=fileopen ("file.txt",1)

 

Your file is opening in read only mode

 

Edit.  I believe you could use 0x as delimiter then just add it back later

2d array simple example 

Dim $array[10][10]

For $col=0 to ubound($array)-1
For $row=0 to ubound($array)-1
$array[$row][$col]
MsgBox("","", $$array[$row][$col])
;this basically just shuffle through the array and display the results

Next
Next

 

I KNEW I was over looking something super simple with the FileWrite! I was staring at it going "There has gotta be a setting I am just not even thinking of..." Thank you! 

As for using 0x , I actually don't think that the function FFGetRawData throws out the 0x too or else this would be ideal.

19 minutes ago, AutoBert said:

This funcs do the job:

Func _FFArrayFromRawData($String, $iRows = 0, $iCols = 0)
    #cs
        _FFArrayFromRawData($String, [$iRows = 0, [$iCols = 0]])
        Params:     $String     the String with raw pixel data as returned from _FFArrayFromRawData
        $iRows      number of Rows in resulting array OPTIONAL
        $iCols      number of Cols in resulting array OPTIONAL
        possible
        Returns:    $aResult[$iPixelCount+1]    $iRows and $iCols = 0
        so all Pixels in a 1D array
        $aResult[$iRows]            1D array
        $aResult[$iRows][$iCols]    2D array
        also
        setting:    @Error      (0 no error, 1 error occured)
        @extended   10 no valid RawDataString
        11 Arraydimensions to big
        1 Array is 1D (info only)
        2 Array is 2D (info only)

        Author:     HarryBotter 2016
    #ce
    Local $aResult[0], $iPixNo, $iEx
    Local $iLen = StringLen($String)
    If Mod($iLen, 8) Then ;no valid RawDataString
        SetError(1, 10)
        Return
    EndIf
    If $iRows * $iCols * 8 > $iLen Then ;Arraydimensions to big
        SetError(1, 11)
        Return
    EndIf
    If $iRows = 0 And $iCols = 0 Then
        $iRows = $iLen / 8
        ReDim $aResult[$iRows]
        $iEx = 1
    Else
        If $iCols = 0 Then
            ReDim $aResult[$iRows]
            $iEx = 1
        Else
            ReDim $aResult[$iRows][$iCols]

            $iEx = 2
        EndIf
    EndIf
    For $i = 0 To $iRows - 1
        If $iEx > 1 Then
            For $j = 0 To $iCols - 1
                $iPixNo = $i * $iCols + $j
                $aResult[$i][$j] = _FFGetPixelColor($iPixNo, $String)
            Next
        Else
            $aResult[$i] = _FFGetPixelColor($i, $String)
        EndIf
    Next
    SetError(0, $iEx, $aResult)
    Return $aResult
EndFunc   ;==>_FFArrayFromRawData

Func _FFGetPixelColor($iPixNo, $String)
    #cs
        Params:     $iPixNo     the number of Pixel for wich the color is extracted
        $String     the String with raw pixel data as returned from _FFArrayFromRawData

        Remarks:    no Errorhandling only for using together with _FFArrayFromRawData

        Author:     HarryBotter 2016
    #ce
    Local $sRet = StringMid($String, $iPixNo * 8 + 1, 8)
    ;ConsoleWrite($iPixNo & ': ' & $sRet & @CRLF)
    Return $sRet
EndFunc   ;==>_FFGetPixelColor

i already posted you the link unsing to script using this in

I need to save CodeBot to my favorites , you have referenced it before and it seems like a valuable source of data. Your solution is very intricuit and will take a little time for me to review and employ for myself. Thank you for the information!

<><><>

So many replies to this little question of mine, I really apreciate every moment that was put into writing back to me. Thank you all very much! I am headed out of the office for the weekend but will be back on this problem ( and probably this forum ) come Monday :)

Thank you again!~

~~~Reiz

Share this post


Link to post
Share on other sites
AutoBert
5 hours ago, alien4u said:

Anyways if this are Hexadecimal color values always with a fixed length for example 4 characters you could take a high multiple of 4.

It's a String each Pixel is represented in BGRA-Format 2 chars for Blue, 2 chars for green, 2 chars for red and 2 chars for the alphachannel

 

2 hours ago, Reizvoller said:

Your solution is very intricuit and will take a little time for me to review and employ for myself.

It's not mine. I had a small look in FastFind's helpfile and i think there a better solutions possible than creating a array and search with AutoItscript for a pixel with specific color. Using the wrapped DLL-calls like FFGetPixel, FFNearestPixel, FFBestSpot should be perfomater you don't need the 2 Steps:

  • FFGetRawData
  • creating a array from resultstring for easier searching

and then searching in the array. If knowing the coords for a pixel you want know the colour use FFGetPixel. If you want the nearest pixel from a given coordinate in defined colour (shadevariantions are possible) user FFNearesPixel. For a Spot of Pixels you can use FFBestSpot, FFNearestSpot.

As this functions are wrapped DLL-calls for the FF.DLL it's much faster than the best optimized AutoIt code. FF.au3 is very complex and so it needs time to explore all the possiblilies. But this time is not wasted for you, not using a FF'-func when it's possible is wasted time. Only in case you know how to include and execute ASM-routines in autoit (I don't) you can build faster algorithm than the FF-funcs.

Share this post


Link to post
Share on other sites
Reizvoller
On 4/8/2016 at 7:06 PM, AutoBert said:

It's a String each Pixel is represented in BGRA-Format 2 chars for Blue, 2 chars for green, 2 chars for red and 2 chars for the alphachannel

 

It's not mine. I had a small look in FastFind's helpfile and i think there a better solutions possible than creating a array and search with AutoItscript for a pixel with specific color. Using the wrapped DLL-calls like FFGetPixel, FFNearestPixel, FFBestSpot should be perfomater you don't need the 2 Steps:

  • FFGetRawData
  • creating a array from resultstring for easier searching

and then searching in the array. If knowing the coords for a pixel you want know the colour use FFGetPixel. If you want the nearest pixel from a given coordinate in defined colour (shadevariantions are possible) user FFNearesPixel. For a Spot of Pixels you can use FFBestSpot, FFNearestSpot.

As this functions are wrapped DLL-calls for the FF.DLL it's much faster than the best optimized AutoIt code. FF.au3 is very complex and so it needs time to explore all the possiblilies. But this time is not wasted for you, not using a FF'-func when it's possible is wasted time. Only in case you know how to include and execute ASM-routines in autoit (I don't) you can build faster algorithm than the FF-funcs.

Howdy!

I applied the idea of  using just PixelSearch for another process for the same web interface. Trouble is, with this next step, there are many items that will have the color I am looking for and the location is going to change. This problem is actually why I am making this little script because this particular task is very cumbersome.

The entire thing, the work space,  renders as a big BMP and is not searchable as text. 

 

So the strategy was this ...

  1. Get reference RAW data for the areas of interest that I want to automatically navigate to/find
    1. Get a snapShot of the wanted area, convert to RAW, save on a .txt
  2. Open the work area
  3. Snap shot work area
  4. Search for the reference RAW in the WorkArea SnapShot RAW
  5. Scroll down x units 
  6. Go back to step 2

It isn't the most elegant of solutions but with the interface I have, it's really my only option ( that I can see at the moment. )

I suppose the better way would be to find a more finite way to specify the target areas I am wanting the script to find. Like a 1 pixel tall by 100 pixels wide rather than an area of 300x500 pixels.

I am going to see about finding other ways to search through this thing in the meantime. I think that my described method is too lengthy of a process to really be useful when compared against just manual searching. 

Edited by Reizvoller

Share this post


Link to post
Share on other sites
AutoBert

You don't need FFGetRawData, FFGetPixel searches in SnapShot too and this much faster. I think (not tested, i am no gamer or gamebotter) that building 2DArray with FFGetPixel is Faster than the way Hairy Botter showed. 

Share this post


Link to post
Share on other sites
Reizvoller
23 minutes ago, AutoBert said:

You don't need FFGetRawData, FFGetPixel searches in SnapShot too and this much faster. I think (not tested, i am no gamer or gamebotter) that building 2DArray with FFGetPixel is Faster than the way Hairy Botter showed. 

Quick note this is NOT for a game in any capacity! 

But your information is quite useful and will be tested once I get the chance, thank you. 

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

  • Similar Content

    • Iceburg
      By Iceburg
      Hi everyone, I'm at best a noobie.  I have read through the Array helps, and specifically the 2D array help file, and I'm struggling to get my code working.
      I have an array that is read from a file, thats working great.  I'm trying to do some math on the array, so I can find the largest, average, lowest, day over day change %, etc.
      The array read working fine, I get 43 lines, line 0 is 44, and then I get data that looks like
      0519 $10,000
      0520 $10,001
      0521 $10,002
      The data in this array is a single 1D array, breaking it out into 2 columns so I can do the math is what I can get to happen.  
      How do I reference the array to store this data?  Second, how do I assign this data to the appropriate row/column?
      Thanks in advance.
      Dim $all_cash_amounts[UBound($aInput)][2] Dim $max_amount_in_account Dim $min_amount_in_account _FileReadToArray($LC_Check_file_path, $aInput) _ArrayDisplay($aInput) local $date = StringRegExp($aInput[1], "(\d\d\d\d)", 1) local $cash = StringRegExp($aInput[1], "\d+\s(-?[0-9\.\,]+)", 1) ConsoleWrite("Date is: " & $date & @CRLF) For $i = 1 To UBound($aInput)-1     $date = StringRegExp($aInput[$i], "(\d\d\d\d)", 1)     $all_cash_amounts[$i][2] = $date[$i][0], $cash[$i][1]      Next _ArrayDisplay($all_cash_amounts)  
    • OldGuyWalking
      By OldGuyWalking
      Given an array with multiple columns that is displayed in a listview,
       ===> What is the fastest/most efficient way to create and manage multiple filters and display results in ListView.
      I have a text file that loads into a listview that has string, numeric, and date columns.  The main file contains about 5100 rows. It's loaded into an array and (in this ListView) it's pre-filtered to display a range of rows based on a start and end date.  On the form I have menu options for various filters. (see below).
      I have options to filter on an "Air Date" column (=Today, >=Today, <=Today) and on a numeric field that is either 1 or 0 that indicate Active or Ended.

      For each filter option I have a prebuilt array that holds a subset of the main array based on a single filter.  For the list above I have the main Array and 5 additional arrays.  None of the arrays are updated since this is for "view only" purposes.  This is a short list and I could have done the filtering "live" but I have several of these forms and so kept the same functionality in each. I have another ListView that displays the complete 5100 row list with 3 filters that, when building the filters live was considerably slower than using prebuilt arrays.
      If I want to expand past simple single column filtering, using an array for each filter becomes cumbersome especially if I want to combine filters using AND & OR.
      The text file I'm working with has 16 columns. If I setup filters for 4 columns and include AND / OR capability that would require prebuilding 24 arrays to cover the various combinations.
      If using the slower method of building a filtered array in real time each time a different filter is selected is the only way to go with this then I'll live with it. It is less overhead. .
      Below is the code I'm currently using to "filter" an array.  My next change was going to add AND / OR functionality (see the info above the header for where I was going with this) .
      ; Description ...: Delete rows from an array and only keep rows that meet the crtieria of identified columns. ; ; Next Change: Add AND/OR to combine filters. Use array to hold multiple criteria and values? ; ; Local $aCriteria[][] = [["",$iColNbr1, $sOperator1, $vValue1], ["AND",$iColNbr2, $sOperator2, $vValue2], ["OR",$iColNbr3, $sOperator3, $vValue3]] ; The first set of criteria ["", $iColNbr1, $sOperator1, $vValue1] must start with a "". ; If anything is entered in that first parameter it will be ignored. ; If the first parameter in any additional criteria set is left blank, or it is not OR, it will default to AND. ; If $aArray is 1 dimension with more than one set of criteria, only the first set will be used. ; Any criteria that uses a column that is less than 0 or higher than the total number of columns in the array will return an error. ; ; Recognized data types for this function are: S (String), D (Date), N (Number). ; ; Recognized Operators are: "EQ", "NEQ", "IN", "GT", "GE", "LT", "LE", "BETWEEN". ; ****** Not all operators work with all data types. ; #FUNCTION# ==================================================================================================================== ; Name ..........: _ArrayFilter ; Description ...: Delete rows from an array and only keep rows that meet the crtieria of identified columns. ; Syntax ........: _ArrayFilter(Byref $aArray[, $iCol = 0[, $sOperator = "EQ"[, $vValue = ""[, $iOptionBase = 0]]]]) ; Parameters ....: $aArray - Array being filtered. ; $iCol - [optional] Column to filter. Default is 0. ; $sOperator - [optional] Operator. Default is "EQ". ; $vValue - [optional] Criteria to compare the column/row value against. ; $iOptionBase - [optional] Starting row. Default is 0. ; Return values .: None ; Author ........: OldGuyWalking ; Modified ......: ; Remarks .......: ; Related .......: ; Link ..........: ; Example .......: No ; =============================================================================================================================== Func _ArrayFilter(ByRef $aArray, $iCol = 0, $sOperator = "EQ", $vValue = "", $iOptionBase = 0) Local $hFunc = _ArrayFilter $vValue = StringStripWS($vValue, 3) If $vValue = "[Today]" Then $vValue = _NowCalcDate() EndIf Local $sMsg Local $sMsgHdr Local $n1 Local $sDeleteIndex Local $aDeleteIndex Local $iCnt = 0 Local $iRows Local $iColMax Local $iDim Local $sData Local $sVType Local $sDType Local $LBound Local $iDiff If $iOptionBase <> 0 Then $iOptionBase = 1 EndIf If _IsValueEmpty($aArray) Then Return SetError(1, 0, "") EndIf $iDim = UBound($aArray, $UBOUND_DIMENSIONS) If $iDim = 1 Then If $iCol <> 0 Then $iCol = 0 EndIf EndIf If $iDim = 2 Then $iColMax = UBound($aArray, $UBOUND_COLUMNS) - 1 If $iCol > $iColMax Or $iCol < 0 Then Return SetError(1, 0, "") EndIf EndIf If Not _IsBetween($iDim, 1, 2) Then ;############### MSG2 - START ############### $sMsgHdr = FuncName($hFunc) & " :Line: " & @ScriptLineNumber & " :Error= " & @error $sMsg = "Invalid Dimensioned Array. Must be a 1 or 2 dimensional array." MsgBox(0, $sMsgHdr, $sMsg) Return SetError(1, 0, "") ;############### MSG2 - END ############### EndIf ; Identify what the value is ; If it is not a String, Int, Number, or Date then skip. Select Case _DateIsValid($vValue) = 1 $sVType = "D" Case IsNumber($vValue) = 1 $sVType = "N" Case IsString($vValue) = 1 $sVType = "S" Case Else ;############### MSG2 - START ############### $sMsgHdr = FuncName($hFunc) & " :Line: " & @ScriptLineNumber & " :Error= " & @error $sMsg = "Comparison value must be a " & @CRLF & _ "1. Date in YYYY/MM/DD format " & @CRLF & _ "2. A string " & @CRLF & _ "3. A number " & @CRLF MsgBox(0, $sMsgHdr, $sMsg) Return SetError(1, 0, "") ;############### MSG2 - END ############### EndSelect $iCnt = 0 For $n1 = UBound($aArray) - 1 To $iOptionBase Step -1 If $iDim = 1 Then $sData = StringStripWS($aArray[$n1], 3) ElseIf $iDim = 2 Then $sData = StringStripWS($aArray[$n1][$iCol], 3) EndIf Select Case _DateIsValid($sData) = 1 $sDType = "D" Case IsNumber($sData) = 1 $sDType = "N" Case IsString($sData) = 1 $sDType = "S" Case Else $sDType = "U" EndSelect If _IsValueEmpty($sData) Then $sDeleteIndex &= $n1 & "," $iCnt += 1 ContinueLoop ; $sDType = $sVType EndIf If Not _IsValueEmpty($sData) And $sDType <> $sVType Then $sDeleteIndex = $sDeleteIndex & $n1 & "," $iCnt += 1 ContinueLoop EndIf Select Case $sOperator = "EQ" Switch $sDType Case "D" $iDiff = _DateDiff("D", $vValue, $sData) If $iDiff = 0 Then ContinueLoop EndIf $sDeleteIndex &= $n1 & "," $iCnt += 1 ContinueLoop Case "S" If $sData = $vValue Then ContinueLoop EndIf $sDeleteIndex &= $n1 & "," $iCnt += 1 ContinueLoop Case "N" If $sData = $vValue Then ContinueLoop EndIf $sDeleteIndex &= $n1 & "," $iCnt += 1 ContinueLoop EndSwitch Case $sOperator = "NEQ" Switch $sDType Case "D" If $sData <> $vValue Then ContinueLoop EndIf $sDeleteIndex &= $n1 & "," $iCnt += 1 ContinueLoop Case "S" If $sData <> $vValue Then ContinueLoop EndIf $sDeleteIndex &= $n1 & "," $iCnt += 1 ContinueLoop Case "N" If $sData <> $vValue Then ContinueLoop EndIf $sDeleteIndex &= $n1 & "," $iCnt += 1 ContinueLoop EndSwitch Case $sOperator = "IN" Switch $sDType Case "S" If StringInStr($sData, $vValue) Then ContinueLoop EndIf $sDeleteIndex &= $n1 & "," $iCnt += 1 ContinueLoop EndSwitch Case $sOperator = "GT" Switch $sDType Case "N" If $sData > $vValue Then ContinueLoop EndIf $sDeleteIndex &= $n1 & "," $iCnt += 1 ContinueLoop Case "D" $iDiff = _DateDiff("D", $vValue, $sData) If $iDiff > 0 Then ContinueLoop EndIf $sDeleteIndex &= $n1 & "," $iCnt += 1 ContinueLoop EndSwitch Case $sOperator = "GE" Switch $sDType Case "N" If $sData >= $vValue Then ContinueLoop EndIf $sDeleteIndex &= $n1 & "," $iCnt += 1 ContinueLoop Case "D" $iDiff = _DateDiff("D", $vValue, $sData) If $iDiff >= 0 Then ContinueLoop EndIf $sDeleteIndex &= $n1 & "," $iCnt += 1 ContinueLoop EndSwitch Case $sOperator = "LT" Switch $sDType Case "N" If $sData < $vValue Then ContinueLoop EndIf $sDeleteIndex &= $n1 & "," $iCnt += 1 ContinueLoop Case "D" $iDiff = _DateDiff("D", $vValue, $sData) If $iDiff < 0 Then ContinueLoop EndIf $sDeleteIndex &= $n1 & "," $iCnt += 1 ContinueLoop EndSwitch Case $sOperator = "LE" Switch $sDType Case "N" If $sData <= $vValue Then ContinueLoop EndIf $sDeleteIndex &= $n1 & "," $iCnt += 1 ContinueLoop Case "D" $iDiff = _DateDiff("D", $vValue, $sData) If $iDiff <= 0 Then ContinueLoop EndIf $sDeleteIndex &= $n1 & "," $iCnt += 1 ContinueLoop EndSwitch EndSelect Next If $iCnt > 0 Then _DeleteArrayRows($aArray, $sDeleteIndex) EndIf EndFunc ;==>_ArrayFilter Thanks in advance.
      OldGuyWalking
    • MyEarth
      By MyEarth
      Hello. I have a 1D array. Is made in this way:
      1. This is a line Messages: a message etc Context: a context etc 2. This is a line Messages: a message etc Context: a context etc 3. This is a line Messages: a message etc Correction: a correction etc Context: a context etc I need to make something like:
      1. This is a line|Messages: a message etc|Context: a context etc 2. This is a line|Messages: a message etc|Context: a context etc 3. This is a line|Messages: a message etc|Correction: a correction|Context: a context etc For exporting in another software. I need to split every time there is a number when the line start, can be 1. until something like 3.976. Since i don't know if there a 2 line after a number or 3 i have opened this thread. Thanks
    • FMS
      By FMS
      Hello,
      The last couple of day's I was searching on this forum for the best way to put array's inside array's.
      The best example's i found where a little outdatet (2010) whit a lot of pro's and con's.
      Now I've a big script where a lot of computations and big array's are involved, so speed is a big issue.
      Also I wanna try the script below but don't know iff speed is a problem this way or maybe there is a better way to do this.

      Does somebody know's the best way to put array's inside array's and get the data back from them?
      I've made an example of something I was thinking about.
      (maybe something totaly wrong but I'm open for sugestions)
      I'm doing it this way because I don't think I can access the data inside the array (and doing some calculations to it) some other way if the array is inside another array.
      Or is there?
      Thanks in advanced.
      #include <Array.au3> Global $aArray[Random(5,10,1)][Random(5,10,1)] Global $Holder[2][2] For $x = 0 To UBound($aArray,1) - 1 For $y = 0 To UBound($aArray,2) - 1 $aArray[$x][$y] = Round(Random(-1,1),4) Next Next $Holder[0][0] = $aArray $aArray = "" Global $get_array = $Holder[0][0] _ArrayDisplay($get_array)  
    • FMS
      By FMS
      Hello,
      I'm trying to randomly change some cells in a array on a given percentage.
      at this point I 've a array whit all 0's and want to change some cells to 1.
      I'm not shure how to do this in a good coding sort of way.
      Also maybe there is a build in function whish I'm not aware of.
      Does somebody know how I can do this in a easy way?
      I was trying to get the total count of cells and get the percentage of it.
      And was stuck when i wanna change the cell.
      please advice, thanks in advanced for your help.
      #include <Array.au3> Global $percentage = 0.2 Global $aArray[Random(10,30,1)][Random(10,30,1)] For $x = 0 To UBound($aArray,1) - 1 For $y = 0 To UBound($aArray,2) - 1 $aArray[$x][$y] = 0 Next Next _ArrayDisplay($aArray) randomize() _ArrayDisplay($aArray) Func randomize() Local $total_to_change = ((UBound($aArray,1) * UBound($aArray,2)) / 100) * $percentage ConsoleWrite( "$total_to_change = " & $total_to_change & @LF ) ConsoleWrite( "total in array = " & (UBound($aArray,1) * UBound($aArray,2)) & @LF ) EndFunc  
×

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.