gcue Posted July 6, 2016 Posted July 6, 2016 (edited) hello =) i am trying to store meta data on some images and i would like to be able to read them later. this is how i was thinking on storing them: $who = "bobby! sally2-meg,charles ryan,#swimmermike" $what = "#kickin' it 4real@home!" $where = "@myhouse" $when = "2015:02:06" $tag = "WHO:" & $who & "|" & "WHAT:" & $what & "|" & "WHERE:" & $where & "|" & "WHEN:" & $when & "|" this is the format of the result i get when reading the tags Quote User Comment : WHO:bobby! sally2-meg,charles ryan,#swimmermike|WHAT:#kickin' it 4real@home!|WHERE:@myhouse|WHEN:2015:02:06| i was going to do a _stringbetween to get the results but gets messy when some of the tags arent there. good news is i am storing the data so i can put it in any format i want - but i do have to consider special characters the user may input id like the output for each field $who $what $where $when as seperate variables i think it might be a better suited job for stringregexp any recomendations? thanks in advance! Edited July 6, 2016 by gcue
gcue Posted July 6, 2016 Author Posted July 6, 2016 (edited) this is what i have so far.. $results = "User Comment : WHO:bobby! sally2-meg,charles ryan,#swimmermike|WHAT:#kickin' it 4real@home!|WHERE:@myhouse|WHEN:2015:02:06|" $array = StringRegExp($results, 'WHO.*?(\V.+)', 1) i get the full results though.. how can i tell it to stop? and what if that specific field is missing? Edited July 6, 2016 by gcue
Danyfirex Posted July 6, 2016 Posted July 6, 2016 (edited) Hello. I know that you're not asking for this. But maybe this can help you to store your data using a diferent way. I just get interesting in save metadata and did this. expandcollapse popup#include <Array.au3> Local $who = "bobby! sally2-meg,charles ryan,#swimmermike" Local $what = "#kickin' it 4real@home!" Local $where = "@myhouse" Local $when = "2015:02:06" ;Structure ;Int -> Number of Fields ;Int -> Data Size ;byte ->Raw Data ;Next based in Number of Fields #Region Test 1 Local $aMetaData[] = [$who, $what, $where, $when] ConsoleWrite("+Create Meta Data File" & @CRLF) Local $tMetaData = _MakeStructure($aMetaData) _WriteMetaData("MetaData.bin", $tMetaData) ConsoleWrite(@CRLF & @CRLF & "+Read Meta Data" & @CRLF ) Local $aNewMetaData = _ReadMetaData("MetaData.bin") _ArrayDisplay($aNewMetaData) ShellExecute("notepad.exe", @ScriptDir & "\MetaData.Bin") #EndRegion #Region Test 2 ;With More Vaules Local $aMetaData[] = ["Hi", 123456, "Danyfirex", "Autoit","Rocks","World"] ConsoleWrite("+Create Meta Data File" & @CRLF) Local $tMetaData = _MakeStructure($aMetaData) _WriteMetaData("MetaData.bin", $tMetaData) ConsoleWrite(@CRLF & @CRLF & "+Read Meta Data" & @CRLF ) Local $aNewMetaData = _ReadMetaData("MetaData.bin") _ArrayDisplay($aNewMetaData) ShellExecute("notepad.exe", @ScriptDir & "\MetaData.Bin") #EndRegion Func _ReadMetaData($sFilePath) Local $sFileBin = _GetFileBin($sFilePath) Local $iSize = @extended Local $tMetaData = DllStructCreate("byte[" & $iSize & "]") DllStructSetData($tMetaData, 1, $sFileBin) ConsoleWrite(DllStructGetData($tMetaData, 1) & @CRLF) Local $tNumberOfFields = DllStructCreate("int", DllStructGetPtr($tMetaData)) Local $iNumberOfFields = DllStructGetData($tNumberOfFields, 1) ConsoleWrite("Number of Fields: " & $iNumberOfFields & @CRLF) Local $aMetaData[$iNumberOfFields] Local $pNextData = DllStructGetPtr($tMetaData) + 4 ;4 size Of Int If $iNumberOfFields Then Local $tFieldSize = 0 Local $tFieldData = 0 Local $iFieldSize = 0 Local $sFieldData = 0 For $i = 0 To $iNumberOfFields - 1 $tFieldSize = DllStructCreate("int", $pNextData) $iFieldSize = DllStructGetData($tFieldSize, 1) $tFieldData = DllStructCreate("wchar[" & $iFieldSize & "]", $pNextData + 4) ;+4 To Get Data $sFieldData = DllStructGetData($tFieldData, 1) ConsoleWrite("FieldSize: " & $iFieldSize & @CRLF) ConsoleWrite("FieldData: " & $sFieldData & @CRLF) $aMetaData[$i] = $sFieldData $pNextData += $iFieldSize $pNextData += 4 If $iFieldSize = 0 Then $pNextData += 2 Next EndIf Return $aMetaData EndFunc ;==>_ReadMetaData Func _GetFileBin($sFilePath) Local $hFile = FileOpen($sFilePath, 16) Local $sFileBin = FileRead($hFile) Local $iSize = @extended FileClose($hFile) Return SetError(0, $iSize, $sFileBin) EndFunc ;==>_GetFileBin Func _WriteMetaData($sFilePath, $tStruct) Local $tStructBytes = DllStructCreate("byte[" & DllStructGetSize($tStruct) & "]", DllStructGetPtr($tStruct)) Local $hFile = FileOpen($sFilePath, 18) FileWrite($hFile, DllStructGetData($tStructBytes, 1)) FileClose($hFile) EndFunc ;==>_WriteMetaData Func _MakeStructure($aMetaData) Local $sTagStructure = "Int NumberOfFields;" Local $tStruct = 0 For $i = 0 To UBound($aMetaData) - 1 $sTagStructure &= "align 1; int FieldSize" & String($i + 1) & ";wchar FieldData" & String($i + 1) & "[" & StringLen($aMetaData[$i]) + 1 & "];" Next ConsoleWrite($sTagStructure & @CRLF) $tStruct = DllStructCreate($sTagStructure) ConsoleWrite(IsDllStruct($tStruct) & @CRLF) $tStruct.NumberOfFields = UBound($aMetaData) For $i = 0 To UBound($aMetaData) - 1 DllStructSetData($tStruct, "FieldSize" & String($i + 1), (StringLen($aMetaData[$i]) * 2) + 2) DllStructSetData($tStruct, "FieldData" & String($i + 1), ($aMetaData[$i])) ConsoleWrite("FiledSize: " & DllStructGetData($tStruct, "FieldSize" & String($i + 1)) & @CRLF) ConsoleWrite("FiledData: " & DllStructGetData($tStruct, "FieldData" & String($i + 1)) & @CRLF) Next Return $tStruct EndFunc ;==>_MakeStructure Saludos Edited July 6, 2016 by Danyfirex Danysys.com AutoIt... UDFs: VirusTotal API 2.0 UDF - libZPlay UDF - Apps: Guitar Tab Tester - VirusTotal Hash Checker Examples: Text-to-Speech ISpVoice Interface - Get installed applications - Enable/Disable Network connection PrintHookProc - WINTRUST - Mute Microphone Level - Get Connected NetWorks - Create NetWork Connection ShortCut
gcue Posted July 6, 2016 Author Posted July 6, 2016 very nice going through dll i just want to be able to store and read from the images themselves so i dont need to keep a file storing the information. i think this format might be good $tag = "WHO:" & $who & "|" & "WHAT:" & $what & "|" & "WHERE:" & $where & "|" & "WHEN:" & $when & "|" just need the stringregexp to get each field
MuffinMan Posted July 6, 2016 Posted July 6, 2016 What about using StringSplit? You wouldn't even need the WHO: WHAT: WHERE: if you didn't want it in there and it deals with "missing" data nicely too... #include<array.au3> Local $who = "bobby! sally2-meg,charles ryan,#swimmermike" Local $what = "#kickin' it 4real@home!" Local $where = "@myhouse" Local $when = "2015:02:06" $tag = "WHO:" & $who & "|" & "WHAT:" & $what & "|" & "WHERE:" & $where & "|" & "WHEN:" & $when & "|" $array = StringSplit($tag,"|") _ArrayDisplay($array)
gcue Posted July 6, 2016 Author Posted July 6, 2016 isn't that kind of sloppy though? because first id have to strip out "user comment.... " then id have to strip out each the field names
Danyfirex Posted July 6, 2016 Posted July 6, 2016 What I wrote can be used to write to any file. (write a little change) I'm not a regexp man. so I prefer doing it using string functions only. #include <Array.au3> $results = "User Comment : WHO:bobby! sally2-meg,charles ryan,#swimmermike|WHAT:#kickin' it 4real@home!|WHERE:@myhouse|WHEN:2015:02:06|" Local $aStrings = StringSplit($results, "|") Local $iNumberOfFields = $aStrings[0] - 1 If $iNumberOfFields > 0 Then Local $aFields[$iNumberOfFields] Local $aMatch = 0 Local $iStartPos = 0 Local $iIndex = 0 For $i = 1 To $aStrings[0] $aMatch = StringRegExp($aStrings[$i], "WHO:|WHAT:|WHERE:|WHEN:", 3) ;~ _ArrayDisplay($aMatch) If IsArray($aMatch) Then $iStartPos = StringInStr($aStrings[$i], $aMatch[0]) $aFields[$iIndex] = StringMid($aStrings[$i], $iStartPos + StringLen($aMatch[0])) $iIndex += 1 EndIf Next EndIf _ArrayDisplay($aFields) Saludos Skysnake 1 Danysys.com AutoIt... UDFs: VirusTotal API 2.0 UDF - libZPlay UDF - Apps: Guitar Tab Tester - VirusTotal Hash Checker Examples: Text-to-Speech ISpVoice Interface - Get installed applications - Enable/Disable Network connection PrintHookProc - WINTRUST - Mute Microphone Level - Get Connected NetWorks - Create NetWork Connection ShortCut
gcue Posted July 6, 2016 Author Posted July 6, 2016 (edited) wow that's complex! but works! thanks! =) Edited July 6, 2016 by gcue
mikell Posted July 6, 2016 Posted July 6, 2016 (edited) So the regex way could be this... #Include <Array.au3> $str = "User Comment : WHO:bobby! sally2-meg,charles ryan,#swimmermike|WHAT:#kickin' it 4real@home!|WHERE:@myhouse|WHEN:2015:02:06| " $res = StringRegExp($str, '(?<=WHO:|WHAT:|WHERE:|WHEN:)([^\|]*)', 3) _ArrayDisplay($res) Edited July 6, 2016 by mikell
jguinch Posted July 6, 2016 Posted July 6, 2016 @mikell : \ is not needed inside [ ] Spoiler Network configuration UDF, _DirGetSizeByExtension, _UninstallList Firefox ConfigurationArray multi-dimensions, Printer Management UDF
mikell Posted July 7, 2016 Posted July 7, 2016 17 hours ago, jguinch said: @mikell : \ is not needed inside [ ] Despite this belt and braces syndrom it works anyway
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now