Sign in to follow this  
Followers 0
dreamzboy

Read String into Array and Swap

11 posts in this topic

#1 ·  Posted (edited)

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

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

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

#4 ·  Posted (edited)

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

tab delimited?

It's sometime space and sometime tab.

Share this post


Link to post
Share on other sites

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

#7 ·  Posted (edited)

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

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

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
1 person likes this

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

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

#11 ·  Posted (edited)

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  
Followers 0

  • Similar Content

    • Ascer
      By Ascer
      1. Description.
      Udf working with MSDN System.Collections.ArrayList. Allow you to make fast operations on huge arrays, speed is even x10 better than basic _ArrayAdd.  Not prefered for small arrays < 600 items. 2. Requirements
      .NET Framework 1.1 - 4.5 (on this version Microsoft destroy old rules) System Windows 3. Possibilities.
      ;=============================================================================================================== ; UDF Name: List.au3 ; ; Date: 2018-02-17, 10:52 ; Description: Simple udf to create System Collections as ArrayList and make multiple actions on them. ; ; Function(s): _ListCreate -> Creates a new list ; _ListCapacity -> Gets a list size in bytes ; _ListCount -> Gets items count in list ; _ListIsFixedSize -> Get bool if list if fixed size ; _ListIsReadOnly -> Get bool if list is read only ; _ListIsSynchronized -> Get bool if list is synchronized ; _ListGetItem -> Get item on index ; _ListSetItem -> Set item on index ; ; _ListAdd -> Add item at end of list ; _ListClear -> Remove all list items ; _ListClone -> Duplicate list in new var ; _ListContains -> Get bool if item is in list ; _ListGetHashCode -> Get hash code for list ; _ListGetRange -> Get list with items between indexs ; _ListIndexOf -> Get index of item ; _ListInsert -> Insert a new item on index ; _ListInsertRange -> Insert list into list on index ; _ListLastIndexOf -> Get index last of item ; _ListRemove -> Remove first found item ; _ListRemoveAt -> Remove item in index ; _ListRemoveRange -> Remove items between indexs ; _ListReverse -> Reverse all items in list ; _ListSetRange -> Set new value for items in range ; _ListSort -> Sort items in list (speed of reading) ; _ListToString -> Get list object name ; _ListTrimToSize -> Remove unused space in list ; ; Author(s): Ascer ;=============================================================================================================== 4. Downloads
      List.au3 5. Examples
      SpeedTest _ArrayAdd vs ListAdd SpeedTest ArraySearch vs ListIndexOf Basic usage - crating guild with members  
    • ronmage
      By ronmage
      So I have a loop that keeps reading data from an array and searching it for the same value. If the value is no there it does work then adds the value to the array to prevent it from doing the same work.
      If _ArraySearch($ID,$filearray[$i]) = -1 Then Work.... _ArrayAdd($ID,$filearray[$i]) EndIf This is in a for loop hence $i
      So what is happening is the code works great for several hours. After a period of time _ArraySearch($ID,$filearray[$i]) will result in -1 even if $ID = $filearray. So it ready as if there is no data in the array. Anyone have this problem? 
       
      Also I am just running in using F5 not compiling it and running it if that makes a difference.
       
    • FMS
      By FMS
      Hello,
      I'm trying to read a binary file to an array but couln't get it to work.
      Also I coul not find any help in the forum around this subject whish was helpfull.
      Is there any way it could be done?
      I tried a lot of ways but maybe somebody know's the right way?
      #AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7 #include <File.au3> #include <Array.au3> #include <AutoItConstants.au3> Local $in=FileOpen("TEST_labels.idx1-ubyte",16) ; 16+0=Read binary Local $data = FileRead($in) Local $FileArray = BinaryToString($data,4) ;~ $FileArray = StringSplit($BinarydData, @CRLF, 1+2) ;~ Local $FileArray = StringRegExp($BinarydData, "[^\r\n]+", 3) FileClose($in) _ArrayDisplay($FileArray,"$FileArray","",32) MsgBox($MB_SYSTEMMODAL, "", "$FileArray = " & $FileArray )  
      TEST_labels.idx1-ubyte
    • ur
      By ur
      I am reading a CSV file which is tab seperated as below.
      Local $aArray = FileReadToArray($file) And now, I am splitting this main array record wise so that Array contains internally another arrow to represent each row.
      For $i = 0 to (UBound($aArray) - 1) ;MsgBox(0,"",$aArray[$i]) $aArray[$i] = StringSplit(StringStripCR($aArray[$i]), Chr(9),2);Chr(9) for tab ;_ArrayDisplay($aArray[$i]) Next Afther that, _ArrayDIsplay is able to see the individual internal arrays.
      _ArrayDisplay($aArray[1]) But If I try to access the individual element of it as below.It is not showing any result.
      MsgBox(0,"",$aArray[1][1]) Any suggestion, below is the sample csv file.
      New Text Document.csv
    • Jibsbrown
      By Jibsbrown
      Need some help understanding why the ConsoleWrite works inside 2nd For loop but not out side. Between Audit Wiki, Help file , Forum searching (lots of code reading), and YouTube ( shout out to TutsTeach), I have not been able to find the reason why. 
      $sIniPath = "installLog.ini" ; - Get section name $iniSctionNames = IniReadSectionNames($sIniPath) ; - Get Keys and Vaules For $a = 1 to UBound($iniSctionNames) - 1 $keys = IniReadSection($sIniPath , $iniSctionNames[$a]) For $b = 1 to UBound($keys) - 1 $oldSysInfo = IniRead($sIniPath , $iniSctionNames[1], $keys[$b][0], "") $PntIPInfo = IniRead($sIniPath , $iniSctionNames[2], $keys[$b][0], "") $NewPCInfor = IniRead($sIniPath , $iniSctionNames[3], $keys[$b][0], "") ;ConsoleWrite($oldSysInfo & @LF) Next ;ConsoleWrite($oldSysInfo & @LF) Next ConsoleWrite($oldSysInfo) My intention is to use the variables later for Listboxes. Any explanation, forum post links or whatever would help. Sorry also very very new to Autoit.
      Also here's the ini file.
      [OldSysInfo] 4=192.168.0.4|DESKTOP-RDIU2SN|R90M05Q8 5=192.168.0.5|SD0123456789101|R9WGP9P 6=192.168.0.6|SD0123456789102|R9WGP9PT 3=192.168.0.3|DESKTOP-3RS4LKL|R9WGP9P 23=192.168.0.23|SD0123456789102|MXL1234P5I [PrinterIp] 50=192.168.0.50 48=192.168.0.48 47=192.168.0.47 [NewSysInfo] newPC = SD0123456789adfs|192.168.0.185|2UA1234FTR Thank you for your time.