BugFix Posted August 27, 2007 Posted August 27, 2007 Hi,I've needed FileWriteFromArray to use with 2D-array.Thats why I've made _FileWriteFromArray2D and co-function _FileReadToArray2D.By set an delimiter for _FileReadToArray2D, an 2D-array will create. In this case all lines from given file must have the same count of delimiters. Otherwise an error occurs.Array[0] respectively Array[0][0] include count of readed lines.expandcollapse popup;========================================================================================================================================== ; Function: _FileWriteFromArray2D($FILEPATH, $ARRAY [, $iROWstart=0 [, $iROWend=0 [, $iCOLstart=0 [, $iCOLend=0 [, $DELIM='|']]]]]) ; ; Description: Write 1D/2D array to file, 2D with delimiter between every entry ; ; Parameter(s): $FILEPATH - path/filename of the file to be write ; $ARRAY - array to write from ; optional $iROWstart - start row-index, default 0 ; optional $iROWend - end row-index, default Ubound(array)-1 ; optional $iCOLstart - start column-index, default 0 ; optional $iCOLend - end column-index, default Ubound(array,2)-1 ; optional $DELIM - delimiter for 2D-array entries, default '|' ; ; Requirement(s): None ; ; Return Value(s): On Success - Returns -1 ; On Failure - Returns 0 and sets @error = 1 (given array is'nt array); @error = 2 (unable to open filepath) ; ; Note: If $iROWstart > $iROWend or $iCOLstart > $iCOLend the values will be swapped among ; ; Author(s): BugFix ( bugfix@autoit.de ) ;========================================================================================================================================== Func _FileWriteFromArray2D($FILEPATH, $ARRAY, $iROWstart=0, $iROWend=0, $iCOLstart=0, $iCOLend=0, $DELIM='|') If Not IsArray($ARRAY) Then SetError(1) Return 0 EndIf Local $Ubound = UBound($ARRAY) If $iROWend = 0 Then $iROWend = $Ubound-1 Local $fh = FileOpen($FILEPATH, 2) If $fh = -1 Then SetError(2) Return 0 EndIf Select Case $iROWstart < 0 Or $iROWstart > $Ubound-1 $iROWstart = 0 ContinueCase Case $iROWend < 0 Or $iROWend > $Ubound-1 $iROWend = $Ubound-1 ContinueCase Case $iROWstart > $iROWend $tmp = $iROWstart $iROWstart = $iROWend $iROWend = $tmp EndSelect Local $Ubound2nd = UBound($ARRAY, 2) If @error = 2 Then For $i = $iROWstart To $iROWend FileWriteLine($fh, $ARRAY[$i]) Next Else If $iCOLend = 0 Then $iCOLend = $Ubound2nd-1 Select Case $iCOLstart < 0 Or $iCOLstart > $Ubound2nd-1 $iCOLstart = 0 ContinueCase Case $iCOLend < 0 Or $iCOLend > $Ubound2nd-1 $iCOLend = $Ubound2nd-1 ContinueCase Case $iCOLstart > $iCOLend $tmp = $iCOLstart $iCOLstart = $iCOLend $iCOLend = $tmp EndSelect For $i = $iROWstart To $iROWend $tmp = '' For $k = $iCOLstart To $iCOLend If $k < $iCOLend Then $tmp &= $ARRAY[$i][$k] & $DELIM Else $tmp &= $ARRAY[$i][$k] EndIf Next FileWriteLine($fh, $tmp) Next EndIf FileClose($fh) Return -1 EndFunc ;==>_FileWriteFromArray2D ;========================================================================================================================================== ; Function: _FileReadToArray2D($FILEPATH, $ARRAY [, $DELIM=-1]) ; ; Description: Read 1D/2D array from file, if $DELIM is given (<> -1) 2D array will created ; ; Parameter(s): $FILEPATH - path/filename of the file to read in an array ; $ARRAY - array variable to hold readed data ; optional $DELIM - delimiter for 2D-array entries, default -1 (none 2D-array) ; ; Requirement(s): None ; ; Return Value(s): On Success - Returns -1 ; On Failure - Returns 0 and sets @error = 1 (given file are not seperated with given delimiter or count of delimiters ; are not equal); @error = 2 (unable to open filepath) ; ; Note: If given file is delimited to create 2D-array ALL lines need the same count of delimiters, otherwise an error occurs! ; ; Author(s): BugFix ( bugfix@autoit.de ) ;========================================================================================================================================== Func _FileReadToArray2D($FILEPATH, ByRef $ARRAY, $DELIM=-1) Local $fh = FileOpen($FILEPATH, 0), $line, $var, $n = 1 If $fh = -1 Then SetError(2) Return 0 EndIf If $DELIM <> -1 Then $line = FileReadLine($fh, 1) $var = StringSplit($line, $DELIM) If IsArray($var) Then $Ubound2nd = $var[0] Local $AR[1][$Ubound2nd] $AR[0][0] = 0 Else SetError(1) Return 0 EndIf While 1 $line = FileReadLine($fh, $n) If @error = -1 Then ExitLoop $var = StringSplit($line, $DELIM) If IsArray($var) Then ReDim $AR[UBound($AR)+1][$Ubound2nd] For $i = 0 To $Ubound2nd-1 $AR[UBound($AR)-1][$i] = $var[$i+1] Next $AR[0][0] += 1 Else SetError(1) Return 0 EndIf $n += 1 Wend Else Local $AR[1] $AR[0] = 0 While 1 $line = FileReadLine($fh, $n) If @error = -1 Then ExitLoop ReDim $AR[UBound($AR)+1] $AR[UBound($AR)-1] = $line $AR[0] += 1 $n += 1 WEnd EndIf FileClose($fh) $ARRAY = $AR Return -1 EndFunc ;==>_FileReadToArray2D Best Regards BugFix
Moderators SmOke_N Posted August 27, 2007 Moderators Posted August 27, 2007 That's gotta be slow.... ? Try storing all the information in a string buffer, then write it when the loops are done for a bit more speed. Also, If I'm not mistaken, if you look in randallc's signature, you'll see these functions (probably faster if I know him) than the standards anyway. Common sense plays a role in the basics of understanding AutoIt... If you're lacking in that, do us all a favor, and step away from the computer.
supersonic Posted September 21, 2010 Posted September 21, 2010 (edited) Hi! Very useful! May be there's a way to avoid 'ReDim'? I think 'ReDim' is rather slooow... Greets, -supersonic. Edited September 21, 2010 by supersonic
gcue Posted September 26, 2014 Posted September 26, 2014 this was very helpful for me thank you for sharing!
Moderators Melba23 Posted September 26, 2014 Moderators Posted September 26, 2014 gcue,This functionality was added to the standard FileWriteFrom/ReadToArray in v3,3,12,0. M23 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area
AutoBert Posted May 5, 2016 Posted May 5, 2016 On 26.9.2014 at 5:48 PM, Melba23 said: This functionality was added to the standard FileWriteFrom/ReadToArray in v3,3,12,0 With _FileReadToArray2D from @BugFix you can specify start-,endrow and start-,endcolumn. I just modified his version: expandcollapse popup;========================================================================================================================================== ; Function: _FileWriteFromArray2D($FILEPATH, $ARRAY [, $iROWstart=0 [, $iROWend=0 [, $iCOLstart=0 [, $iCOLend=0 [, $DELIM='|']]]]]) ; ; Description: Write 1D/2D array to file, 2D with delimiter between every entry ; ; Parameter(s): $FILEPATH - path/filename of the file to be write ; $ARRAY - array to write from ; optional $iROWstart - start row-index, default 0 ; optional $iROWend - end row-index, default Ubound(array)-1 ; optional $iCOLstart - start column-index, default 0 ; optional $iCOLend - end column-index, default Ubound(array,2)-1 ; optional $DELIM - delimiter for 2D-array entries, default '|' ; ; Requirement(s): None ; ; Return Value(s): On Success - Returns -1 ; On Failure - Returns 0 and sets @error = 1 (given array is'nt array); @error = 2 (unable to open filepath) ; ; Note: If $iROWstart > $iROWend or $iCOLstart > $iCOLend the values will be swapped among ; ; Author(s): BugFix ( bugfix@autoit.de ) ; modified: autoBert ;========================================================================================================================================== Func _FileWriteFromArray2D($FILEPATH, $ARRAY, $iROWstart = 0, $iROWend = 0, $iCOLstart = 0, $iCOLend = 0, $DELIM = '|') If Not IsArray($ARRAY) Then SetError(1) Return 0 EndIf Local $Ubound = UBound($ARRAY) If $iROWend = 0 Then $iROWend = $Ubound - 1 Local $fh = FileOpen($FILEPATH, 2) If $fh = -1 Then SetError(2) Return 0 EndIf Select Case $iROWstart < 0 Or $iROWstart > $Ubound - 1 $iROWstart = 0 ContinueCase Case $iROWend < 0 Or $iROWend > $Ubound - 1 $iROWend = $Ubound - 1 ContinueCase Case $iROWstart > $iROWend $tmp = $iROWstart $iROWstart = $iROWend $iROWend = $tmp EndSelect Local $Ubound2nd = UBound($ARRAY, 2) If @error = 2 Then $tmp = '' For $i = $iROWstart To $iROWend $tmp &= $ARRAY[$i] & @CRLF Next FileWrite($fh, StringStripWS($tmp, 2)) Else If $iCOLend = 0 Then $iCOLend = $Ubound2nd - 1 Select Case $iCOLstart < 0 Or $iCOLstart > $Ubound2nd - 1 $iCOLstart = 0 ContinueCase Case $iCOLend < 0 Or $iCOLend > $Ubound2nd - 1 $iCOLend = $Ubound2nd - 1 ContinueCase Case $iCOLstart > $iCOLend $tmp = $iCOLstart $iCOLstart = $iCOLend $iCOLend = $tmp EndSelect $tmp = '' For $i = $iROWstart To $iROWend For $k = $iCOLstart To $iCOLend If $k < $iCOLend Then $tmp &= $ARRAY[$i][$k] & $DELIM Else $tmp &= $ARRAY[$i][$k] & @CRLF EndIf Next Next FileWrite($fh, StringStripWS($tmp, 2)) EndIf FileClose($fh) Return -1 EndFunc ;==>_FileWriteFromArray2D this version builds whole string and write only one time to harddisk, so i hope it speeds up.
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