Jump to content
Sign in to follow this  
RyukShini

Splitting string/file

Recommended Posts

I have a string looking like this:
Outsider:myemail@myemail.com:26e0112200304f6d7598f6bd90a8478d:_KPQX)B7C0IX~!QgqG*V*){X<71O{{

This is how my database looks, I would like to split my file in to
User
Email
Hash:Salt

The reason why I wish to do this is to have an easier view of my users, I may also want to encrypt passwords even further and I cannot do this with a string looking like that!

Thanks in advance.

Share this post


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

$string="Outsider:myemail@myemail.com:26e0112200304f6d7598f6bd90a8478d:_KPQX)B7C0IX~!QgqG*V*){X<71O{{"
$split=StringSplit($string,":")
_ArrayDisplay($split)

NB: If colons can appear in your salt, you would have to catenate $split entries 4-N if split[0]>4.

Edited by RTFC

Share this post


Link to post
Share on other sites
8 minutes ago, RTFC said:
#include <Array.au3>

$string="Outsider:myemail@myemail.com:26e0112200304f6d7598f6bd90a8478d:_KPQX)B7C0IX~!QgqG*V*){X<71O{{"
$split=StringSplit($string,":")
_ArrayDisplay($split)

NB: If colons can appear in your salt, you would have to catenate $split entries 4-N if split[0]>4.

Hi thanks, it works!
but what if a string contains this:
tester:test@test.com:9b6af4443774867abc06358645aa4cdb:D>!+\,6gR!sJ+{:q5Z]Wy2/!q:0PXZ

As you can see their are : within the salt.
Thanks in advance!

Share this post


Link to post
Share on other sites

Please note my comment below the code snippet in my previous post. In short:

1. check if $split[0]>4; if not, you're done

2. add  colon plus next part of salt to start of salt for all parts >4

#include <Array.au3>

$string="tester:test@test.com:9b6af4443774867abc06358645aa4cdb:D>!+\,6gR!sJ+{:q5Z]Wy2/!q:0PXZ"
$split=stringsplit($string,":")
For $sc=5 to $split[0]
    $split[4]&=":"&$split[$sc]
Next
Redim $split[5]
_ArrayDisplay($split)

So the For...Next loop is carried out only if $split[0] is at least 5.

Alternatively you could store the salt as a hexstring, and convert to binary where necessary.

Edited by RTFC

Share this post


Link to post
Share on other sites
7 minutes ago, RTFC said:

Please note my comment below the code snippet. In short:

1. check if $split[0]>4, if not, you're done

2. add  colon plus next part of salt to start of salt for all parts >4

#include <Array.au3>

$string="tester:test@test.com:9b6af4443774867abc06358645aa4cdb:D>!+\,6gR!sJ+{:q5Z]Wy2/!q:0PXZ"
$split=stringsplit($string,":")
For $sc=5 to $split[0]
    $split[4]&=":"&$split[$sc]
Next
Redim $split[5]
_ArrayDisplay($split)

So the For...Next loop is carried out only if $split[0] is at least 5.

Works great.
Now if  I have a file with say 500 lines, I could write 500 instead of 5, but couldn't I load the line number in a variable if I am unsure how many lines their is in the file I wish to organize?

Thanks in advance.

Share this post


Link to post
Share on other sites

Please read up on FileReadLine and _FileWriteFromArray in the Help file. Read an entry, split it, store it.

You can of course also store the 1D array $split into a new row of your own 2D array in each read-iteration.

That should be sufficient to get you started, methinks.

Share this post


Link to post
Share on other sites
Just now, RTFC said:

Please read up on FileReadLine and _FileWriteFromArray in the Help file. Read an entry, split it, store it.

You can of course also store the 1D array $split into a new row of your own 2D array in each read-iteration.

That should be sufficient to get you started, methinks.

#include <Array.au3>

$file = FileRead("new.txt")
$split=StringSplit($file,":")
For $sc=5 to $split[0]
    $split[5]&=":"&$split[$sc]
Next
Redim $split[5]
_ArrayDisplay($split)

It works fine, but this still gives me 5 only.
I want it to read all of the file, so maybe I should use [$i] or something?
maybe.

For $i = 1 to $line or something similar?
Thanks in advance.

Share this post


Link to post
Share on other sites
20 minutes ago, RTFC said:

Check FileReadLine, not FileRead.

I made it work, but now it will only load 4 lines.

028bfeada69e7ea1cc1f1bc0657e2d0c.png

Now the first 4 lines works fine, but the rest is blank??
Thanks in advance
 

#include <Array.au3>
#include <FileConstants.au3>
#include <MsgBoxConstants.au3>
#include <WinAPIFiles.au3>
$file = "new.txt"
Local $hFileOpen = FileOpen("new.txt", $FO_READ)

Local $sFileRead = FileReadLine($hFileOpen, 1)
$split=StringSplit($sFileRead,":")
For $sc=100 to $split[0]
    $split[100]&=":"&$split[$sc]
Next
Redim $split[100]
_ArrayDisplay($split)

 

Share this post


Link to post
Share on other sites

Okay, one last try.:x

As I told you before ("in each read iteration"), you need to repeat the stringsplit for every line of your file, and store the data per line. Something like this (haven't tested it).

#include <Array.au3>
#include <File.au3>
#include <FileConstants.au3>

$file = "new.txt"
$lines=_FileCountLines($file)
global $list[$lines+1][4]
Local $hFileOpen = FileOpen($file, $FO_READ)

Local $curline=0
Local $sFileRead = FileReadLine($hFileOpen, 1)
while not @error
    $split=StringSplit($sFileRead,":")
    For $sc=5 to $split[0]
        $split[4]&=":"&$split[$sc]
    Next

    $curline+=1
    for $sc=1 to 4
        $list[$curline][$sc-1]=$split[$sc]
    next
    $sFileRead = FileReadLine($hFileOpen)
WEnd
FileClose($hFileOpen)
$list[0]=$lines
_ArrayDisplay($list)

 

Edited by RTFC
bug

Share this post


Link to post
Share on other sites
6 minutes ago, RTFC said:

Okay, one last try.:x

As I told you before ("in each read iteration"), you need to repeat the stringsplit for every line of your file, and store the data per line. Something like this (haven't tested it).

#include <Array.au3>
#include <File.au3>
#include <FileConstants.au3>

$file = "new.txt"
$lines=_FileCountLines($file)
global $list[$lines+1][4]
Local $hFileOpen = FileOpen($file, $FO_READ)

Local $curline=0
Local $sFileRead = FileReadLine($hFileOpen, 1)
while not @error
    $split=StringSplit($sFileRead,":")
    For $sc=5 to $split[0]
        $split[4]&=":"&$split[$sc]
    Next

    $curline+=1
    for $sc=1 to 4
        $list[$curline][$sc-1]=$split[$sc]
    next
    $sFileRead = FileReadLine($hFileOpen)
WEnd
FileClose($hFileOpen)
$list[0]=$lines
_ArrayDisplay($list)

 

Sorry, will figure it out!
Thanks a lot for the time and effort you put in this.

Share this post


Link to post
Share on other sites

You're welcome, RyukShini.:)

I'm sure you'll get the hang of it. If not, I would suggest you study the Help example of FileReadLine and read up on 2D arrays.

Good luck,

RT

Share this post


Link to post
Share on other sites

Hi.

I'd like to suggest, to read the full file to an array using _filereadtoarray(). Then loop through this array to process your lines. This will give you a start, I think:

#include <file.au3>
#include <array.au3>


dim $aLines
dim $file="C:\temp\your-input.txt"

$f=FileOpen($file,2+8)

FileWriteLine($f,"Outsider:myemail@myemail.com:26e0112200304f6d7598f6bd90a8478d:_KPQX)B7C0IX~!QgqG*V*){X<71O{{")
FileWriteLine($f,"Insider:InEmail@myemail.com:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:111111111111111111111111111111")
FileWriteLine($f,"upsider:UpEmail@myemail.com:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb:222222222222222222222222222222")
FileClose($f)


_FileReadToArray($File,$aLines)

if IsArray($aLines) Then
    _ArrayDisplay($aLines)
Else
    MsgBox(0,"","not an array")
    Exit
EndIf


for $i = 1 to $aLines[0]
    if StringStripWS($aLines[$i],8)="" Then
        MsgBox(0,"Empty line (or blanks only)","Line #" & $i)
        ContinueLoop
    EndIf
    $aFoo=StringSplit($aLines[$i],":")
    if IsArray($aFoo) Then
        _ArrayDisplay($aFoo)
    Else
        MsgBox(0,"Line " & $i,"The result isn't an array!" & @CRLF & _
        "String:" & @CRLF & _
        $aLines[$i])
    EndIf
Next

regards, Rudi.

 

<edit: Can the salt have ":" in its string?>

Edited by rudi

Earth is flat, pigs can fly, and Nuclear Power is SAFE!

Share this post


Link to post
Share on other sites

i also sugest reading the full fill:

#include <Array.au3>
#include <File.au3>

Global $aAccounts, $iFilledRows

_FileReadToArray('accounts.txt', $aAccounts, $FRTA_NOCOUNT)
;, ':');using splitting in Cols fails on files with diferent colcounts in line
If Not @error Then
    _ArrayColInsert($aAccounts, 1)
    _ArrayColInsert($aAccounts, 1)
    _ArrayColInsert($aAccounts, 1)
    For $iRows = 0 To UBound($aAccounts) - 1
        If Not StringIsSpace($aAccounts[$iRows][0]) Then
            $aSplit = StringSplit($aAccounts[$iRows][0], ':', 2)
            For $iCols = 0 To 2
                $aAccounts[$iRows][$iCols] = $aSplit[$iCols]
            Next
            $sSalt = ''
            For $iCols = 3 To UBound($aSplit) - 1
                $sSalt &= $aSplit[$iCols]
            Next
            $aAccounts[$iRows][3] = $sSalt
            $iFilledRows += 1
        EndIf
    Next
    ReDim $aAccounts[$iFilledRows][4]
EndIf
_ArrayDisplay($aAccounts)

 

Share this post


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

i also sugest reading the full fill:

#include <Array.au3>
#include <File.au3>

Global $aAccounts, $iFilledRows

_FileReadToArray('accounts.txt', $aAccounts, $FRTA_NOCOUNT)
;, ':');using splitting in Cols fails on files with diferent colcounts in line
If Not @error Then
    _ArrayColInsert($aAccounts, 1)
    _ArrayColInsert($aAccounts, 1)
    _ArrayColInsert($aAccounts, 1)
    For $iRows = 0 To UBound($aAccounts) - 1
        If Not StringIsSpace($aAccounts[$iRows][0]) Then
            $aSplit = StringSplit($aAccounts[$iRows][0], ':', 2)
            For $iCols = 0 To 2
                $aAccounts[$iRows][$iCols] = $aSplit[$iCols]
            Next
            $sSalt = ''
            For $iCols = 3 To UBound($aSplit) - 1
                $sSalt &= $aSplit[$iCols]
            Next
            $aAccounts[$iRows][3] = $sSalt
            $iFilledRows += 1
        EndIf
    Next
    ReDim $aAccounts[$iFilledRows][4]
EndIf
_ArrayDisplay($aAccounts)

 

Thanks, it works as intended, but I don't know why, I just can't seem to understand how to get it to display all of the file....
right now it still only displayed 39 results :S
Thanks in advance.

Share this post


Link to post
Share on other sites
20 hours ago, rudi said:

Hi.

I'd like to suggest, to read the full file to an array using _filereadtoarray(). Then loop through this array to process your lines. This will give you a start, I think:

#include <file.au3>
#include <array.au3>


dim $aLines
dim $file="C:\temp\your-input.txt"

$f=FileOpen($file,2+8)

FileWriteLine($f,"Outsider:myemail@myemail.com:26e0112200304f6d7598f6bd90a8478d:_KPQX)B7C0IX~!QgqG*V*){X<71O{{")
FileWriteLine($f,"Insider:InEmail@myemail.com:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:111111111111111111111111111111")
FileWriteLine($f,"upsider:UpEmail@myemail.com:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb:222222222222222222222222222222")
FileClose($f)


_FileReadToArray($File,$aLines)

if IsArray($aLines) Then
    _ArrayDisplay($aLines)
Else
    MsgBox(0,"","not an array")
    Exit
EndIf


for $i = 1 to $aLines[0]
    if StringStripWS($aLines[$i],8)="" Then
        MsgBox(0,"Empty line (or blanks only)","Line #" & $i)
        ContinueLoop
    EndIf
    $aFoo=StringSplit($aLines[$i],":")
    if IsArray($aFoo) Then
        _ArrayDisplay($aFoo)
    Else
        MsgBox(0,"Line " & $i,"The result isn't an array!" & @CRLF & _
        "String:" & @CRLF & _
        $aLines[$i])
    EndIf
Next

regards, Rudi.

 

<edit: Can the salt have ":" in its string?>

Yes it can have ":" in the salt :/

Share this post


Link to post
Share on other sites
22 hours ago, RTFC said:

You're welcome, RyukShini.:)

I'm sure you'll get the hang of it. If not, I would suggest you study the Help example of FileReadLine and read up on 2D arrays.

Good luck,

RT

Thanks, doing this now.
Its strange cos i feel i've done more complicated stuff in the past, but this one is just giving me a headache :/

Share this post


Link to post
Share on other sites

You could do it using a regex, it can be more accurate in case of tricky splits
(error checking missing in the code below)

#include <Array.au3>

$str = "this is a test:indeed" & @crlf & _
    "Outsider:myemail@myemail.com:26e0112200304f6d7598f6bd90a8478d:_KPQX)B7C0IX~!QgqG*V*){X<71O{{" & _ 
    @crlf & _
    "Insider:InEmail@myemail.com:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:1111111111111:1111111:111111:1111" & _
    @crlf & _ 
    "tester:test@test.com:9b6af4443774867abc06358645aa4cdb:D>!+\,6gR!sJ+{:q5Z]Wy2/!q:0PXZ"

$tmp = StringRegExp($str, '(?m)^(.+?):(.+?):(.*)\R?', 3)
Local $res[UBound($tmp)/3][3]
   For $i = 0 to UBound($tmp)-1 step 3
       For $j = 0 to 2
          $res[$i/3][$j] = $tmp[$i+$j]
       Next
   Next
_ArrayDisplay($res)

 

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 Zedna
      #include <WinAPI.au3> $text = FileReadLastChars("C:\Program Files\AutoIt3\Include\Array.au3", 1024) MsgBox(0, 'FileReadLastChars', $text) Func FileReadLastChars($sFile, $nChars)     Local $nBytes     $tBuffer = DLLStructCreate("char["&$nChars&"]")     $hFile = _WinAPI_CreateFile($sFile, 2, 2) ; open for read     _WinAPI_SetFilePointer($hFile, -1 * $nChars, 2) ; from end     _WinAPI_ReadFile($hFile, DLLStructGetPtr($tBuffer), $nChars, $nBytes)     _WinAPI_CloseHandle($hFile)     Return DLLStructGetData($tBuffer, 1) EndFunc ; included as standard UDF since AutoIt 3.2.13.6 version Func _WinAPI_SetFilePointer($hFile, $iPos, $iMethod = 0)     $aResult = DllCall( "kernel32.dll", "long", "SetFilePointer", "hwnd", $hFile, "long", $iPos, "long_ptr", 0, "long", $iMethod)     If @error Then Return SetError(1, 0, -1)     If $aResult[0] = -1 Then Return SetError(2, 0, -1) ; $INVALID_SET_FILE_POINTER = -1     Return $aResult[0] EndFunc ;==>_WinAPI_SetFilePointer Here is my topic about _WinAPI_SetFilePointer()
       
      EDIT: simpler version compatible with latest AutoIt
      $text = FileReadLastChars("C:\Program Files\AutoIt3\Include\Array.au3", 1024) MsgBox(0, 'FileReadLastChars', $text) Func FileReadLastChars($sFile , $nChars) $hFile = FileOpen($sFile, 0) ; open for read FileSetPos($hFile, -1 * $nChars, 2) ; from end $sRet = FileRead($hFile) FileClose($hFile) Return $sRet EndFunc  
    • By nacerbaaziz
      hello evrybody
      here is an example about how to split your texts using a delimiter with the ability to select how much of delimiters shows in each colum  with $i_number
      e.g
      you have a long text and you want to split it in an array
      that evry colum have a number (n) of lines
      i made a function that do that for you
      just call it with a three params
      $s_text
      your text
      $i_number
      the number that you want to put in each col
      $s_siparator
      the siparator
      default is "|"
      here is the function with example
      i hope that it will be useful for you
       
      ****
       
      #include <Array.au3> $s_txt = "some text1some text2|some text3|some text4|some text5|some text6" $array = splitText($s_txt, 2) _ArrayDisplay($array) Func splitText($s_text, $i_number, $s_siparator = "|") Local $a_TXT = StringSplit($s_text, $s_siparator) Local $a_Return[$a_TXT[0] + 1] If ($a_TXT[0] <= $i_number) Or ($i_number <= 0) Then ReDim $a_Return[2] $a_Return[0] = 1 $a_Return[1] = $s_text Return $a_Return EndIf Local $i_Processed = 1, $i_arrayProcessed = 1 Do For $i = $i_Processed To ($i_Processed + $i_number) - 1 If ($a_TXT[0] < $i) Then ExitLoop If Not ($a_Return[$i_arrayProcessed]) Then $a_Return[$i_arrayProcessed] = $a_TXT[$i] Else $a_Return[$i_arrayProcessed] &= $s_siparator & $a_TXT[$i] EndIf $i_Processed += 1 Next $i_arrayProcessed += 1 Until ($a_TXT[0] < $i_Processed) ReDim $a_Return[$i_arrayProcessed] $a_Return[0] = $i_arrayProcessed - 1 Return $a_Return EndFunc ;==>splitText
      accept my greetings
      thanks to
      @Dan_555
      for his notes
       
    • By cruisepandey
      Hi, 
      I have a string like this : 
      Global $Msga = "urrent directory is /send.  (Submission of file with log number 29381077284 is confirmed)";
      I want to extract the number 29381077284  from the string. I did StringSplit to split based on "(" and then use space to reach there, But it's not a good choice. 
      Can anyone help me with regular expression to find the number from String using AutoIT. TIA
    • By DannyJ
      I have this example string:
       
      2020-06-08 09:23:33 : abcdefghifjklm How to trim just the right part? Or how to trim this text right to left?
      I want to trim this string right to left until ' : '.
      In ohter words: I need the 'abcdefghifklm' text.
      I have tried StringTrimRight, but that requires 
      The number of characters to trim. Unfortunately StringSplit trims the left part of the strings.
       
       
    • By careca
      This is my take on string triggers, triggers on specific strings.
      Able to simple text pasting,
      opening links (as long as there's a www. http:\\ or https:\\ at the beggining)
      and is able to open applications, if there is a parameter in the parameter field, it uses it.
      Shows your external, lan, and gateway ip's.
      Able to change system volume by a set percentage, reading from the inputbox the number the user sets, if 0 or empty uses system default.
      I made this because the existing string trigger applications didn't do it for me.
      I did this for me, but if someone finds it useful, all the better.
×
×
  • Create New...