Jump to content
Sign in to follow this  
dreamzboy

Read String into Array and Swap

Recommended Posts

dreamzboy

Hi All,

Sorry for raising this noobie thread but I can't seem to find a function that can read a string and break it up into an Array. I hope it's easy to do. I can do this in C but Autoit is a little different. Here's an example of what I would like to do, have an input box (GuiCtrlCreateEdit) where user can paste the information into it and my program will swap the information to have the output below with a click of a button:

User Input:

134.567.890.123 Hostname1 #Some comment on the Hostname

094.123.344.333 Hostname2 #Another comment on the Hostname.

.

.

To be specific:

Array[0,0] = 134.567.890.123 Array[0,1] = Hostname 1

Array[1,0] = 094.123.344.333 Array[1,1] = Hostname 2

What I would like to see in the output:

Hostname1 134.567.890.123

Hostname2 094.123.344.333

.

.

.

One method that I was going to use is StringisSpace, but that function only detects spaces. If there are any characters within it, it does not work. How will I go about making this work? I know I'll have to use the "_Arrayswap" function within the library but will it work given that I have 2 dimensions array?

Thanks in advance guys! It's been awhile since I did any programming.

Edited by dreamzboy

Share this post


Link to post
Share on other sites
Mechaflash

tab delimited?


Spoiler

“Hello, ladies, look at your man, now back to me, now back at your man, now back to me. Sadly, he isn’t me, but if he stopped using ladies scented body wash and switched to Old Spice, he could smell like he’s me. Look down, back up, where are you? You’re on a boat with the man your man could smell like. What’s in your hand, back at me. I have it, it’s an oyster with two tickets to that thing you love. Look again, the tickets are now diamonds. Anything is possible when your man smells like Old Spice and not a lady. I’m on a horse.”

 

Share this post


Link to post
Share on other sites
iamtheky

Dim $Aarray[2][2]

$Aarray[0][0] = "134.567.890.123"
$Aarray[0][1] = "Hostname 1"
$Aarray[1][0] = "094.123.344.333"
$Aarray[1][1] = "Hostname 2"


msgbox (0, '' , $Aarray[0][1] & @TAB & $Aarray[0][0] & @CRLF & $Aarray[1][1] & @TAB & $Aarray[1][0])


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

Share this post


Link to post
Share on other sites
DicatoroftheUSA

Another skinned cat. It may be a faster script without messing with arrays.

$sSampleText="134.567.890.123 Hostname1 #Some comment on the Hostname"

$sSampleText=StringRegExpReplace($sSampleText , '(.*?)h+(.*?)h+(#.*)v?' , '$2 $1 $3' , 0)
MsgBox(0,"gar",$sSampleText)
Edited by DicatoroftheUSA

Share this post


Link to post
Share on other sites
dreamzboy

tab delimited?

It's sometime space and sometime tab.

Share this post


Link to post
Share on other sites
dreamzboy

Another skinned cat. It may be a faster script without messing with arrays.

$sSampleText="134.567.890.123 Hostname1 #Some comment on the Hostname"

$sSampleText=StringRegExpReplace($sSampleText , '(.*?)h+(.*?)h+(#.*)v?' , '$2 $1 $3' , 0)
MsgBox(0,"gar",$sSampleText)

This will not work because I'm going use GuiCtrlCreateEdit and have user input those information. It could ranges from 1 line to 100 lines. The program would need to read the user input and then convert it to the output suggested above.

Share this post


Link to post
Share on other sites
DicatoroftheUSA

Here is another example with multiple lines with some built in pattern detection. Notice the string after @crlf is relatively backwards.

$sSampleText="134.567.890.123 Hostname1 #Some comment on the Hostname"&@CRLF&"Hostname2 094.123.344.333 #Another comment on the Hostname."

$sSampleText=StringRegExpReplace($sSampleText , '([0-9]{1,3}[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3})h+(.*?)h+(#.*)v?' , '$2 $1 $3' )
$sSampleText=StringStripWS($sSampleText,4)
MsgBox(0,"gar",$sSampleText)
Edited by DicatoroftheUSA

Share this post


Link to post
Share on other sites
dreamzboy

Thanks for the useful tip. It's just unfortunate that your code is not flexible. Quite honestly, I'm looking for a function to detect a "space or tab" between the string, from there I'll know how to break it up into arrays to make the code easier to manage. I'll hate to do all this in a C console while Autoit has such a nice GUI to it.

Any additional help is much appreciated.

Share this post


Link to post
Share on other sites
Mechaflash

You can grill and season it...

#include <Array.au3>
Local $asInput[2], $asOutput[2][2]
$asInput[0] = "192.168.0.1" & @TAB & "hostname 1" & @TAB & "#some comment about hostname 1"
$asInput[1] = "192.168.0.2 hostname 2 #some comment about hostname 2"
For $string in $asInput
    _Output($asOutput, $string)
    If @error Then msgbox(64 + 262144, @ScriptName, "Failed to parse '" & $string & "'. Was not TAB or SPACE delimited.")
    _ArrayDisplay($asOutput) ; Check Output
Next

Func _Output(ByRef $asOutput, $sString)
    Static $x = 0 ; hehe... static-x
    $asSplit = StringSplit($sString, "#")
    If Not @error Then $sString = $asSplit[1]
    If StringInStr($sString, @TAB) Then
        $asSplit = 0
        $asSplit = StringSplit($sString, @TAB)
        $asOutput[$x][0] = $asSplit[2]
        $asOutput[$x][1] = $asSplit[1]
        $x+=1
        Return SetError(0,0,True)
    Else
        $iSpace = StringInStr($sString, " ")
        If Not @error Then
            $asOutput[$x][0] = StringRight($sString, StringLen($sString) - $iSpace)
            $asOutput[$x][1] = StringLeft($sString, $iSpace - 1)
            Return SetError(0,0,False)
        Else
            Return SetError(1,0,False)
        EndIf
    EndIf
    Return SetError(1,0,False)
EndFunc
  • Like 1

Spoiler

“Hello, ladies, look at your man, now back to me, now back at your man, now back to me. Sadly, he isn’t me, but if he stopped using ladies scented body wash and switched to Old Spice, he could smell like he’s me. Look down, back up, where are you? You’re on a boat with the man your man could smell like. What’s in your hand, back at me. I have it, it’s an oyster with two tickets to that thing you love. Look again, the tickets are now diamonds. Anything is possible when your man smells like Old Spice and not a lady. I’m on a horse.”

 

Share this post


Link to post
Share on other sites
dreamzboy

You can grill and season it...

#include <Array.au3>
Local $asInput[2], $asOutput[2][2]
$asInput[0] = "192.168.0.1" & @TAB & "hostname 1" & @TAB & "#some comment about hostname 1"
$asInput[1] = "192.168.0.2 hostname 2 #some comment about hostname 2"
For $string in $asInput
_Output($asOutput, $string)
If @error Then msgbox(64 + 262144, @ScriptName, "Failed to parse '" & $string & "'. Was not TAB or SPACE delimited.")
_ArrayDisplay($asOutput) ; Check Output
Next

Func _Output(ByRef $asOutput, $sString)
Static $x = 0 ; hehe... static-x
$asSplit = StringSplit($sString, "#")
If Not @error Then $sString = $asSplit[1]
If StringInStr($sString, @TAB) Then
$asSplit = 0
$asSplit = StringSplit($sString, @TAB)
$asOutput[$x][0] = $asSplit[2]
$asOutput[$x][1] = $asSplit[1]
$x+=1
Return SetError(0,0,True)
Else
$iSpace = StringInStr($sString, " ")
If Not @error Then
$asOutput[$x][0] = StringRight($sString, StringLen($sString) - $iSpace)
$asOutput[$x][1] = StringLeft($sString, $iSpace - 1)
Return SetError(0,0,False)
Else
Return SetError(1,0,False)
EndIf
EndIf
Return SetError(1,0,False)
EndFunc

This is good. Thanks a bunch!! Time to bring out the bbq sauce. ;)

Share this post


Link to post
Share on other sites
UEZ

Here another version:

#include <Array.au3>
$sIP = "134.567.890.123    Hostname1       #Some comment on the Hostname" & @CRLF & _
            "094.123.344.333       Hostname2       #Another comment on the Hostname" & @CRLF & _
            "123.222.111.10        Hostname3       #3rd entry"

$aResult = TransformInput($sIP)
If Not @error Then _ArrayDisplay($aResult)

Func TransformInput($sText)
    If Not IsString($sText) Then Return SetError(1, 0, 0)
    If $sText = "" Then Return SetError(2, 0, 0)
    Local $aSplit = StringRegExp($sText, "(?m)s*(d{1,3}.d{1,3}.d{1,3}.d{1,3})s*(w+)s*", 3)
    If @error Then Return SetError(3, 0, 0)
    Local Const $iUB = UBound($aSplit)
    Local $a2D[Floor($iUB / 2)][2], $i, $j = 0
    While $i < $iUB
        Switch BitAND($i, 1)
            Case 1
                $a2D[$j][0] = $aSplit[$i]
                $j += 1
            Case 0
                $a2D[$j][1] = $aSplit[$i]
        EndSwitch
    $i += 1
    WEnd
    Return $a2D
EndFunc

Br,

UEZ

Edited by UEZ

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

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  

  • Similar Content

    • TrashBoat
      By TrashBoat
      So Im trying to make a simple 2d game and make some sort of collision detection so why not to make a 2 dimensional array but i have no clue how  to write it in multiple lines
      Global $map[5,5] = [0,0,0,0,0 _ [0,0,0,0,0 _ [0,0,0,0,0 _ [0,0,0,0,0 _ [0,0,0,0,0] something like this but it doesn't work
    • Zein
      By Zein
      #include "..\Include\Array.au3" #include "..\Include\File.au3" #include "..\Include\AutoItConstants.au3" Local $aRetArray Local $sFilePath = "n.csv" _FileReadToArray($sFilePath, $aRetArray, ",") ; _FileReadToArray($sFilePath, $aRetArray, $FRTA_COUNT, ",") _ArrayDisplay($aRetArray, "Original", Default, 8) The above code shows two versions of _FileReadToArray and both don't work as expected.
      The first one doesn't use the comma as a delimiter. (so I get a single column array)  I tried adding "Default" between $aRetArray and "," then it told me it had an incorrect number of parameters. 

      I looked again at the documentation:
       
      #include <File.au3> _FileReadToArray ( $sFilePath, ByRef $vReturn [, $iFlags = $FRTA_COUNT [, $sDelimiter = ""]] )
      And I with or without the flags params I should be getting a 2D array due to my file being a csv. 
      I then tried a regular flag, $FRTA_COUNT, and it tells me that I'm using a variable $FRTA_COUNT while it's not declared. Tried putting in 1 instead and it told me again, incorrect number of params. 

       
    • ternal
      By ternal
      Hi,
      Recently I have had the need to do a sort and then do a second sort while the item of the first sort stays the same ( double sorting , first on column x then while column x is the same sort column y).
      I did not put much efffort into error checking but so far I did not need it.
      For my applications so far it works perfectly however if someone is willing I want to test this extensivly.
      If anyone has big lists of random stuff to sort could you try this out please?
      #include <Array.au3> ; #FUNCTION# ==================================================================================================================== ; Name ..........: _ArraySort_Double ; Description ...: ; Syntax ........: _ArraySort_Double (Byref $array[, $first_index = Default[, $second_index = Default[, $ascending = Default]]]) ; Parameters ....: $array - 2d array to sort. ; $first_index - [optional] first column to sort. Default is 0. ; $second_index - [optional] second column to sort. Default is 1. ; $ascending - [optional] ascending/descending. Default is 1. ; Return values .: 1 if no errors occured , -1 if errors occured ; Author ........: Ternal ; Remarks .......: Needs excessive testing. ; Related .......: _arraysort() ; =============================================================================================================================== Func _ArraySort_Double (byref $array, $first_index = Default, $second_index = Default, $ascending = Default) Local $temp_value Local $counter = 1 If UBound($array, $UBOUND_DIMENSIONS) <> 2 Then MsgBox(0, "error", "error") return -1 EndIf If $first_index = Default Then $first_index = 0 If $second_index = Default Then $second_index = 1 If $ascending = Default Then $ascending = 1 _ArraySort($array, $ascending, 0, 0, $first_index); you can alter settings of primary sort here If @error Then MsgBox(0, "error", @error) return -1 EndIf $temp_value = $array[0][$first_index] For $x = 1 to UBound($array, 1) - 1 If Mod( $x, 10000) = 0 Then ConsoleWrite("at " & $x & " of a total : " & UBound($array, 1) & @CRLF) If $array[$x][$first_index] = $temp_value Then $counter+= 1 If $x = UBound($array, 1) - 1 Then; do last line here(if last line is not a new item) _ArraySort($array, $ascending, $x - $counter, $x, $second_index);you can alter settings of secondary sort here(don't forget to place line 34 the exact same) If @error Then MsgBox(0, "error", @error) return -1 EndIf EndIf Else If $counter > 0 Then ;at least 2 of the same _ArraySort($array, $ascending, $x - $counter, $x - 1, $second_index);you can alter settings of secondary sort here(don't forget to place line 29 the exact same) If @error Then MsgBox(0, "error", @error) return -1 EndIf $counter = 1 EndIf EndIf $temp_value = $array[$x][$first_index] Next Return 1 EndFunc Kind regards, Ternal
    • Rskm
      By Rskm
      Hi, I have the following line in a text file 'input.txt'. I know the line number - say '6'. I wish to replace the text 'WWW' in the below line with a random number (I can generate that with random()).
      WERIS  WWWJP   3.83  8.330  1.000                1097.RAXX 
      The WWW is a 3 digit integer (could be any number between 0 to 999), I can use stringtrimleft and get the numerical value of WWW in this file
      so, basically, I know the string to replace (ie; WWW stored in a variable), I know the line number to work on and the file location/name and the replacement variable (through random()). My requirement is to fill that 3 spaces with my random number (which Is a integer between 1 and 999)
      please put ur suggestions
       
    • TrashBoat
      By TrashBoat
      So I've made this script that detects how long i have held down my left mouse button for and stores the information in an array and then sorts its using _ArraySort but the output is half sorted half broken.
      Here's my script:
      HotKeySet("{F1}","_exit") #include <Misc.au3> #include <Timers.au3> #include <Array.au3> Local $dll = DllOpen("user32.dll") $on = False Global $array[0] While(1) If _IsPressed(01,$dll) Then $timer = _Timer_Init() While _IsPressed(01,$dll) Sleep(1) WEnd $time = _Timer_Diff($timer) _ArrayAdd($array,"Time: " & Floor($time) & " ms") ;~ ConsoleWrite("Time: " & Floor($time) & " ms" & @CRLF) EndIf Sleep(50) WEnd Func _exit() _ArraySort($array) _ArrayDisplay($array) Exit EndFunc And the output:

      See how its not sorted?  What is the problem here?
×