carl1905

[Solved] Extracting text from string and reinsert it.

12 posts in this topic

#1 ·  Posted (edited)

Hi, I'm looking for a way to extract specific binary text data from string(except between "[", "]") and convert it.

And put it back to text. How can I do it? Can someone help me?

Example

$text = "[1F010005300020FF]82CD0A[030005300020FF]8177[1F12010000E6300020FF]8178[1F030000300020FF]82F00A8A6F82A682DC82"

Rearrange the text like below

[1F010005300020FF]
0x82CD0A            =>  StringToBinary(0x82CD0A) == A
[030005300020FF]
0x8177          =>  StringToBinary(0x8177) == B
[1F12010000E6300020FF]
0x8178          =>  StringToBinary(0x8178) == C
[1F030000300020FF]
0x82F00A8A6F82A682DC82  =>  StringToBinary(0x82F00A8A6F82A682DC82) == D

$output = "[1F010005300020FF]A[030005300020FF]B[1F12010000E6300020FF]C[1F030000300020FF]D"

 

Edited by carl1905

Share this post


Link to post
Share on other sites



#2 ·  Posted (edited)

Hi, im maybe wrong but try that :

 

$text = "[1F010005300020FF]82CD0A[030005300020FF]8177[1F12010000E6300020FF]8178[1F030000300020FF]82F00A8A6F82A682DC82"

#include <Array.au3>

Func _ArrayAddColumns(ByRef $aArr, $iNumColToAdd = 1)
    If IsArray($aArr) = 0 Then Return SetError(1, 0, -1) ; Filter out non-array
    If $iNumColToAdd < 1 Then Return SetError(2, 0, -1) ; $iNumColToAdd must be greater than zero to add a column.
    If UBound($aArr, 0) > 2 Then Return SetError(3, 0, -1) ; Only allows a 1d or 2d array pass this line.

    If UBound($aArr, 0) = 1 Then ; ====== For 1d array ========
        Local $aRet[UBound($aArr)][$iNumColToAdd + 1] ; Create new 2d array.
        For $r = 0 To UBound($aArr) - 1
            $aRet[$r][0] = $aArr[$r]
        Next
    Else ; ======= For 2d array ============
        Local $aRet = $aArr ; So that ByRef $aArr is not altered outside of function.
        ReDim $aRet[UBound($aRet)][UBound($aRet, 2) + $iNumColToAdd] ; ReDim 2d array only.
    EndIf

    Return $aRet
EndFunc   ;==>_ArrayAddColumns

$split = StringSplit($text,"[]")
_ArrayDisplay($split, "v1")

$split = _ArrayAddColumns($split)
For $i = 1 To Ubound($split) - 1
    $split[$i][1] = BinaryToString("0x" & $split[$i][0])
    $i=$i+1
Next
_ArrayDisplay($split, "v2")

$fill = ""
For $i = 2 to Ubound($split) - 1
    $fill = $fill & "[" & $split[$i][0] & "]" & $split[$i+1][1]
    $i=$i+1
Next
msgbox(0,"Output",$fill)

 

Edit :

$split[$i][1] = BinaryToString("0x" & $split[$i][0], 2);<======= $SB_UTF16LE (2) = binary data is UTF16 Little Endian
$split[$i][1] = BinaryToString("0x" & $split[$i][0], 3);<======= $SB_UTF16BE (3) = binary data is UTF16 Big Endian

 

Edited by Synapsee
1 person likes this

Share this post


Link to post
Share on other sites

Check out StringRegExpReplace()

Share this post


Link to post
Share on other sites

#4 ·  Posted (edited)

$text = "[1F010005300020FF]82CD0A[030005300020FF]8177[1F12010000E6300020FF]8178[1F030000300020FF]82F00A8A6F82A682DC82"

$text = StringReplace($text, "]82CD0A[", "]A[")             ;A
$text = StringReplace($text, "]8177[", "]B[")               ;B
$text = StringReplace($text, "]8178[", "]C[")               ;C
$text = StringReplace($text, "]82F00A8A6F82A682DC82", "]D") ;D

ConsoleWrite($text & @CRLF)

 

Edited by AndyG

Share this post


Link to post
Share on other sites

#5 ·  Posted (edited)

5 hours ago, Synapsee said:

Hi, im maybe wrong but try that :

Thanks for your reply. However, the last one word is missing. And can the output text be arranged in row? Not column.

#include <Array.au3>
#include <MsgBoxConstants.au3>
#include <FileConstants.au3>
Global Const $CP_SHIFT_JIS = 932

$text = "[1F010005300020FF]82CD0A[030005300020FF]8177[1F12010000E6300020FF]8178[1F030000300020FF]82F00A8A6F82A682DC82"

Func _CodepageStructToString($tText, $iCodepage)
    Local $aResult = DllCall("kernel32.dll", "int", "MultiByteToWideChar", "uint", $iCodepage, "dword", 0, "struct*", $tText, "int", DllStructGetSize($tText), _
                                "ptr", 0, "int", 0)
    Local $tWstr = DllStructCreate("wchar[" & $aResult[0] & "]")
    $aResult = DllCall("Kernel32.dll", "int", "MultiByteToWideChar", "uint", $iCodepage, "dword", 0, "struct*", $tText, "int", DllStructGetSize($tText), _
                        "struct*", $tWstr, "int", $aResult[0])
    Return DllStructGetData($tWstr, 1)
EndFunc

Func _ArrayAddColumns(ByRef $aArr, $iNumColToAdd = 1)
    If IsArray($aArr) = 0 Then Return SetError(1, 0, -1) ; Filter out non-array
    If $iNumColToAdd < 1 Then Return SetError(2, 0, -1) ; $iNumColToAdd must be greater than zero to add a column.
    If UBound($aArr, 0) > 2 Then Return SetError(3, 0, -1) ; Only allows a 1d or 2d array pass this line.

    If UBound($aArr, 0) = 1 Then ; ====== For 1d array ========
        Local $aRet[UBound($aArr)][$iNumColToAdd + 1] ; Create new 2d array.
        For $r = 0 To UBound($aArr) - 1
            $aRet[$r][0] = $aArr[$r]
        Next
    Else ; ======= For 2d array ============
        Local $aRet = $aArr ; So that ByRef $aArr is not altered outside of function.
        ReDim $aRet[UBound($aRet)][UBound($aRet, 2) + $iNumColToAdd] ; ReDim 2d array only.
    EndIf

    Return $aRet
EndFunc   ;==>_ArrayAddColumns

$split = StringSplit($text,"[]")
$Str = ""
$fill = ""
$split = _ArrayAddColumns($split)

For $i = 1 To Ubound($split) - 1
    $split[$i][1] = Binary("0x" & $split[$i][0])
    ;msgbox(0,"Output",$split[$i][1])
    Local $tInp = DllStructCreate("byte[" & BinaryLen($split[$i][1]) & "]")
    DllStructSetData($tInp, 1, $split[$i][1])
    Local $Str  = _CodepageStructToString($tInp, $CP_SHIFT_JIS)
          $Str  = StringRegExpReplace($Str ,@CRLF,"<cf>")
          $Str  = StringRegExpReplace($Str ,@LF,"<lf>")
          $Str  = StringRegExpReplace($Str ,@CR,"<cr>")
          $split[$i][1] = $Str  & @CRLF
          $i=$i+1
Next

$fill = ""
For $i = 2 to Ubound($split) - 1
    $fill = $fill & "[" & $split[$i][0] & "]" & $split[$i+1][1]
    $i=$i+1
Next
msgbox(0,"Output",$fill)
FileWrite ("test.txt", $fill)
FileClose ("test.txt")
TrayTip ("Exporter", "Finish!", 3)
sleep (3000)

 

Edited by carl1905

Share this post


Link to post
Share on other sites

#6 ·  Posted (edited)

what is the "test.txt" expected ? u want that :

Quote

[1F010005300020FF][030005300020FF][1F12010000E6300020FF][1F030000300020FF]

は<lf>『』を<lf>覚えま・

Or something else ?

Edited by Synapsee

Share this post


Link to post
Share on other sites

#7 ·  Posted (edited)

1 hour ago, Synapsee said:

what is the "test.txt" expected ? u want that :

Or something else ?

The one that I want is this form.

[1F010005300020FF]<lf>[030005300020FF][1F12010000E6300020FF][1F030000300020FF]<lf>覚えま・

 

Edited by carl1905

Share this post


Link to post
Share on other sites

#8 ·  Posted (edited)

Ah, I missed some last three byte. 0xB582BD

text = "[1F010005300020FF]82CD0A[030005300020FF]8177[1F12010000E6300020FF]8178[1F030000300020FF]82F00A8A6F82A682DC82B582BD"

So, this is the corrected form.

[1F010005300020FF]<lf>[030005300020FF][1F12010000E6300020FF][1F030000300020FF]<lf>覚えました

 

Edited by carl1905

Share this post


Link to post
Share on other sites

Not sure, but try that one :

Local $text = "[1F010005300020FF]82CD0A[030005300020FF]8177[1F12010000E6300020FF]8178[1F030000300020FF]82F00A8A6F82A682DC82"
$out = Execute('"' & StringRegExpReplace($text, "\]\K([^\]]+)(?=\[|$)",  """ & BinaryToString(""0x\1"") & """) & '"')
MsgBox(0, "", $out)

 

Share this post


Link to post
Share on other sites

#10 ·  Posted (edited)

Another examples..

$text2 = "[09020000390011300020FF]82BB82A482CB81428DC58CE382CC90B897EC82C60A8C5F96F182B782E9914F82C90C[1F090200003A0011300020FF]90D882E897A382B582BD82A082C682CC90A28A4582C982C282A282C40A92B282D782C482A882A282BD95FB82AA82A282A282ED82CB"

$result2 = "[09020000390011300020FF]そうね。最後の精霊と<lf>契約する前に�[1F090200003A0011300020FF]切り離したあとの世界について<lf>調べておいた方がいいわね"

$text3 = "814581458145[090200003B0011300020FF]82B182EA82CD8145814581450A88C8914F82E682E88C8382B582AD82C882C182C482A282C882A282A98148"
$result3 = "[090200003B0011300020FF]これは・・・<lf>以前より激しくなっていないか?"

However, $test3 starts with "814581458145" but at the $result3 it disappears.

Maybe this is the corrected form.

#result3_fix = "・・・[090200003B0011300020FF]これは・・・<lf>以前より激しくなっていないか?"

 

Edited by carl1905

Share this post


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

Global Const $CP_SHIFT_JIS = 932

Func _CodepageStructToString($tText, $iCodepage)
    Local $aResult = DllCall("kernel32.dll", "int", "MultiByteToWideChar", "uint", $iCodepage, "dword", 0, "struct*", $tText, "int", DllStructGetSize($tText), _
                                "ptr", 0, "int", 0)
    Local $tWstr = DllStructCreate("wchar[" & $aResult[0] & "]")
    $aResult = DllCall("Kernel32.dll", "int", "MultiByteToWideChar", "uint", $iCodepage, "dword", 0, "struct*", $tText, "int", DllStructGetSize($tText), _
                        "struct*", $tWstr, "int", $aResult[0])
    Return DllStructGetData($tWstr, 1)
EndFunc

Func _ArrayAddColumns(ByRef $aArr, $iNumColToAdd = 1)
    If IsArray($aArr) = 0 Then Return SetError(1, 0, -1) ; Filter out non-array
    If $iNumColToAdd < 1 Then Return SetError(2, 0, -1) ; $iNumColToAdd must be greater than zero to add a column.
    If UBound($aArr, 0) > 2 Then Return SetError(3, 0, -1) ; Only allows a 1d or 2d array pass this line.

    If UBound($aArr, 0) = 1 Then ; ====== For 1d array ========
        Local $aRet[UBound($aArr)][$iNumColToAdd + 1] ; Create new 2d array.
        For $r = 0 To UBound($aArr) - 1
            $aRet[$r][0] = $aArr[$r]
        Next
    Else ; ======= For 2d array ============
        Local $aRet = $aArr ; So that ByRef $aArr is not altered outside of function.
        ReDim $aRet[UBound($aRet)][UBound($aRet, 2) + $iNumColToAdd] ; ReDim 2d array only.
    EndIf

    Return $aRet
EndFunc   ;==>_ArrayAddColumns

$text1 = "[1F010005300020FF]82CD0A[030005300020FF]8177[1F12010000E6300020FF]8178[1F030000300020FF]82F00A8A6F82A682DC82B582BD"
$text2 = "[09020000390011300020FF]82BB82A482CB81428DC58CE382CC90B897EC82C60A8C5F96F182B782E9914F82C90C[1F090200003A0011300020FF]90D882E897A382B582BD82A082C682CC90A28A4582C982C282A282C40A92B282D782C482A882A282BD95FB82AA82A282A282ED82CB"
$text3 = "814581458145[090200003B0011300020FF]82B182EA82CD8145814581450A88C8914F82E682E88C8382B582AD82C882C182C482A282C882A282A98148"

;v1 without @CRLF
$file = "test without crlf.txt"
$text = $text1 & $text2 & $text3
MainFunc($text, $file)

;v2 with @CRLF
$file = "test with crlf.txt"
MainFunc($text1, $file)
FileWrite ($file, @CRLF)
FileClose ($file)
MainFunc($text2 , $file)
FileWrite ($file, @CRLF)
FileClose ($file)
MainFunc($text3, $file)
FileWrite ($file, @CRLF)
FileClose ($file)

Func MainFunc($text, $file)

    $split = StringSplit($text,"[]")
    $Str = ""
    $fill = ""
    $split = _ArrayAddColumns($split)
    ;_ArrayDisplay($split)

    if StringInStr($text, "[") = 1 Then
        $y = 3
    Else
        $y = 1
    EndIf

    For $i = $y-1 To Ubound($split) - 1
        $split[$i][1] = "[" & $split[$i][0] & "]"
        $i=$i+1
        $split[$i][1] = Binary("0x" & $split[$i][0])
        ;msgbox(0,"Output",$split[$i][1])
        Local $tInp = DllStructCreate("byte[" & BinaryLen($split[$i][1]) & "]")
        DllStructSetData($tInp, 1, $split[$i][1])
        Local $Str  = _CodepageStructToString($tInp, $CP_SHIFT_JIS)
              $Str  = StringRegExpReplace($Str ,@CRLF,"<cf>")
              $Str  = StringRegExpReplace($Str ,@LF,"<lf>")
              $Str  = StringRegExpReplace($Str ,@CR,"<cr>")
              $split[$i][1] = $Str
    Next
    ;_ArrayDisplay($split)

    $fill = ""
    For $i = 1 to Ubound($split) - 1
        $fill = $fill & "" & $split[$i][1]
    Next

    ;msgbox(0,"Output",$fill)

    FileWrite ($file, $fill)
    FileClose ($file)

EndFunc

 

1 person likes this

Share this post


Link to post
Share on other sites
10 hours ago, Synapsee said:
#include <Array.au3>
#include <MsgBoxConstants.au3>
#include <FileConstants.au3>

Global Const $CP_SHIFT_JIS = 932

Func _CodepageStructToString($tText, $iCodepage)
    Local $aResult = DllCall("kernel32.dll", "int", "MultiByteToWideChar", "uint", $iCodepage, "dword", 0, "struct*", $tText, "int", DllStructGetSize($tText), _
                                "ptr", 0, "int", 0)
    Local $tWstr = DllStructCreate("wchar[" & $aResult[0] & "]")
    $aResult = DllCall("Kernel32.dll", "int", "MultiByteToWideChar", "uint", $iCodepage, "dword", 0, "struct*", $tText, "int", DllStructGetSize($tText), _
                        "struct*", $tWstr, "int", $aResult[0])
    Return DllStructGetData($tWstr, 1)
EndFunc

Func _ArrayAddColumns(ByRef $aArr, $iNumColToAdd = 1)
    If IsArray($aArr) = 0 Then Return SetError(1, 0, -1) ; Filter out non-array
    If $iNumColToAdd < 1 Then Return SetError(2, 0, -1) ; $iNumColToAdd must be greater than zero to add a column.
    If UBound($aArr, 0) > 2 Then Return SetError(3, 0, -1) ; Only allows a 1d or 2d array pass this line.

    If UBound($aArr, 0) = 1 Then ; ====== For 1d array ========
        Local $aRet[UBound($aArr)][$iNumColToAdd + 1] ; Create new 2d array.
        For $r = 0 To UBound($aArr) - 1
            $aRet[$r][0] = $aArr[$r]
        Next
    Else ; ======= For 2d array ============
        Local $aRet = $aArr ; So that ByRef $aArr is not altered outside of function.
        ReDim $aRet[UBound($aRet)][UBound($aRet, 2) + $iNumColToAdd] ; ReDim 2d array only.
    EndIf

    Return $aRet
EndFunc   ;==>_ArrayAddColumns

$text1 = "[1F010005300020FF]82CD0A[030005300020FF]8177[1F12010000E6300020FF]8178[1F030000300020FF]82F00A8A6F82A682DC82B582BD"
$text2 = "[09020000390011300020FF]82BB82A482CB81428DC58CE382CC90B897EC82C60A8C5F96F182B782E9914F82C90C[1F090200003A0011300020FF]90D882E897A382B582BD82A082C682CC90A28A4582C982C282A282C40A92B282D782C482A882A282BD95FB82AA82A282A282ED82CB"
$text3 = "814581458145[090200003B0011300020FF]82B182EA82CD8145814581450A88C8914F82E682E88C8382B582AD82C882C182C482A282C882A282A98148"

;v1 without @CRLF
$file = "test without crlf.txt"
$text = $text1 & $text2 & $text3
MainFunc($text, $file)

;v2 with @CRLF
$file = "test with crlf.txt"
MainFunc($text1, $file)
FileWrite ($file, @CRLF)
FileClose ($file)
MainFunc($text2 , $file)
FileWrite ($file, @CRLF)
FileClose ($file)
MainFunc($text3, $file)
FileWrite ($file, @CRLF)
FileClose ($file)

Func MainFunc($text, $file)

    $split = StringSplit($text,"[]")
    $Str = ""
    $fill = ""
    $split = _ArrayAddColumns($split)
    ;_ArrayDisplay($split)

    if StringInStr($text, "[") = 1 Then
        $y = 3
    Else
        $y = 1
    EndIf

    For $i = $y-1 To Ubound($split) - 1
        $split[$i][1] = "[" & $split[$i][0] & "]"
        $i=$i+1
        $split[$i][1] = Binary("0x" & $split[$i][0])
        ;msgbox(0,"Output",$split[$i][1])
        Local $tInp = DllStructCreate("byte[" & BinaryLen($split[$i][1]) & "]")
        DllStructSetData($tInp, 1, $split[$i][1])
        Local $Str  = _CodepageStructToString($tInp, $CP_SHIFT_JIS)
              $Str  = StringRegExpReplace($Str ,@CRLF,"<cf>")
              $Str  = StringRegExpReplace($Str ,@LF,"<lf>")
              $Str  = StringRegExpReplace($Str ,@CR,"<cr>")
              $split[$i][1] = $Str
    Next
    ;_ArrayDisplay($split)

    $fill = ""
    For $i = 1 to Ubound($split) - 1
        $fill = $fill & "" & $split[$i][1]
    Next

    ;msgbox(0,"Output",$fill)

    FileWrite ($file, $fill)
    FileClose ($file)

EndFunc

 

Thank you!!

1 person likes this

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

    • Valnurat
      By Valnurat
      I have a mainform with a ListviewControl. The ListView contains data from my SQL Server. My idea is that when you find what you are looking for, in the listview, I pick it by pressing the enter button and then show the content on a child window with some control.
      So my questions are:
      How do you pick the content in the listview with either enter button or the mouse?
      How do you create a child windows with control?
      Global $idListview, $idOKay _FormCreate() _Main() Func _FormCreate() ; Create GUI GUICreate("Computer Asset", 1027, 400) $idListview = GUICtrlCreateListView("", 2, 2, 1024, 268,Default, BitOR($LVS_SHOWSELALWAYS, $LVS_EX_GRIDLINES,$LVS_EX_FULLROWSELECT)) ; Add columns _GUICtrlListView_AddColumn($idListview, "Computername", 100,2) _GUICtrlListView_AddColumn($idListview, "Tkt No.", 100,2) _GUICtrlListView_AddColumn($idListview, "Req No.", 100,2) _GUICtrlListView_AddColumn($idListview, "Order Date", 100,2) _GUICtrlListView_AddColumn($idListview, "Costcenter", 100,2) _GUICtrlListView_AddColumn($idListview, "Username", 100,2) _GUICtrlListView_AddColumn($idListview, "Model", 100,2) _GUICtrlListView_AddColumn($idListview, "Current Location", 100,2) _GUICtrlListView_AddColumn($idListview, "Option", 100,2) _GUICtrlListView_AddColumn($idListview, "Shipdate", 100,2) $idOKay = GUICtrlCreateButton("OK", 310, 290, 85, 25) GUISetState(@SW_SHOW) EndFunc Func _Main() Local $sConnectionString = 'DRIVER={' & $sDriver & '};SERVER=' & $sServer & ';DATABASE=' & $sDatabase & ';UID=' & $sUser & ';PWD=' & $sPassword & ';' Local $oConnection = _ADO_Connection_Create() _ADO_Connection_OpenConString($oConnection, $sConnectionString) If @error Then Return SetError(@error, @extended, $ADO_RET_FAILURE) Local $sTableName = 'StaffMemberUser.ComputerAsset' Local $sQUERY = "Select Computername, TktNo, ReqNo, OrderDate, CostCenter, Username, Model, CurrentLocation, Note, Shipdate from " & $sTableName Local $oRecordset = _ADO_Execute($oConnection, $sQUERY) Local $aRecordsetArray = _ADO_Recordset_ToArray($oRecordset, False) Local $aRecordset_inner = _ADO_RecordsetArray_GetContent($aRecordsetArray) _GUICtrlListView_SetItemCount($idListview, UBound($aRecordset_inner) - 1) _GUICtrlListView_AddArray($idListview, $aRecordset_inner) ; CleanUp $oRecordset = Null _ADO_Connection_Close($oConnection) $oConnection = Null ; Loop until the user exits. While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE ExitLoop Case $idOKay MsgBox($MB_SYSTEMMODAL, "listview item", GUICtrlRead($idListview), 2) Case $idListview MsgBox($MB_SYSTEMMODAL, "listview", "clicked=" & GUICtrlGetState($idListview), 2) EndSwitch WEnd GUIDelete() EndFunc  
    • tcox8
      By tcox8
      Hello,
      Currently I am running a script that calls a powershell script. To read the results of that I am reading StdOut. I am parsing things accordingly but unfortunately it doesn't parse correctly all the time and I end up missing parts of the string or other problems. My question then is, what is the best results for reading what is returned when running a powershell script or something similar?
    • Valnurat
      By Valnurat
      I hope my title is good enough.
      I'm using the ADO UDF and I have question regarding editing SQL records with this UDF.
      The owner of the UDF suggested an idea, but maybe there is another trix.
    • Valnurat
      By Valnurat
      I have a SQL db. I would like to view the content in a control. Like a table. The control should have the option to show every 2nd line in another color. When you pick a "cell" it should pick the whole row. When you dobbelt click on the row another windows should popup with the content from the row.
      What view control can do that?
    • Valnurat
      By Valnurat
      How do I access a sql database for inserting and reading?