Jump to content

_FileArray_Split() can anyone make the function with different code? *Challenge*


guinness
 Share

Recommended Posts

_FileArray_Split() will read a file to an Array for those who write lines using a delimiter e.g. "|" or ","

Example:

1stLine Data1|1stLine Data2|1stLine Data3 ...
2ndLine Data1|2ndLine Data2|2ndLine Data3 ...

The function is working as intended, but I wanted to throw the question out of if anyone can create a similar function with different code? I simply want to learn!

Code:

#AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
#include <Array.au3>
#include <File.au3>

Global $File = @ScriptDir & "\TEMP.txt"

_Test_File($File, "|") ; Creates an Example using "|"
ShellExecute($File)
Global $Array1 = _FileArray_Split($File, "|")
If Not @error Then _ArrayDisplay($Array1)

_Test_File($File, ",") ; Creates an Example using ","
ShellExecute($File)
Global $Array2 = _FileArray_Split($File, ",")
If Not @error Then _ArrayDisplay($Array2)

Func _FileArray_Split($sFile, $sDelimiter = "|")
    Local $sFileOpen = FileOpen($sFile, 0) ; Code based around the function _FileReadToArray included in File.au3
    If $sFileOpen = -1 Then Return SetError(1, 1, 0)
    Local $sFileRead = FileRead($sFileOpen, FileGetSize($sFile))
    If StringRight($sFileRead, 1) = @LF Or StringRight($sFileRead, 1) = @CR Then $sFileRead = StringTrimRight($sFileRead, 1)
    FileClose($sFileOpen)
    If StringInStr($sFileRead, @LF) Then
        Local $TEMPsArray = StringSplit(StringStripCR($sFileRead), @LF)
    ElseIf StringInStr($sFileRead, @CR) Then
        $TEMPsArray = StringSplit($sFileRead, @CR)
    Else
        If StringLen($sFileRead) Then
            Dim $TEMPsArray[2] = [1, $sFileRead]
        Else
            Return SetError(1, 2, 0)
        EndIf
    EndIf

    Local $sStringSplit = StringSplit($TEMPsArray[1], $sDelimiter) ; Split the first line to find the number of columns for defining final Array
    Local $sArray[$TEMPsArray[0] + 1][$sStringSplit[0]] = [[0, $sStringSplit[0]]] ; Define final Array with the results found from reading the file and splitting line 1
    For $A = 1 To $TEMPsArray[0]
        $sStringSplit = StringSplit($TEMPsArray[$A], $sDelimiter) ; Split the nth line to create a Temp Array
        If Not IsArray($sStringSplit) Then ContinueLoop ; If not Array then skip
        For $B = 1 To $sStringSplit[0]
            $sArray[$sArray[0][0] + 1][$B - 1] = $sStringSplit[$B] ; Add split data (by looping) to the final Array
        Next
        If UBound($sArray, 1) <= $sArray[0][0] + 1 Then ReDim $sArray[UBound($sArray, 1) * 2][UBound($sArray, 2)] ; Resize the number of rows if required
        $sArray[0][0] += 1 ; Add count to final Array
    Next
    ReDim $sArray[$sArray[0][0] + 1][UBound($sArray, 2)] ; Remove empty rows located at the end of the final Array
    Return $sArray ; Return the final Array
EndFunc   ;==>_FileArray_Split

Func _Test_File($sFile, $sDelimiter = "|")
    Local $Temp_FileList[1000]
    For $A = 1 To 999
        Local $Text = ""
        For $B = 1 To 10
            $Text &= "Example_" & $B & $sDelimiter
        Next
        $Temp_FileList[$A] = StringTrimRight($Text, 1)
        $Temp_FileList[0] += 1
    Next
    _FileWriteFromArray($sFile, $Temp_FileList, 1)
    Return 1
EndFunc   ;==>_Test_File

UDF List:

 
_AdapterConnections()_AlwaysRun()_AppMon()_AppMonEx()_ArrayFilter/_ArrayReduce_BinaryBin()_CheckMsgBox()_CmdLineRaw()_ContextMenu()_ConvertLHWebColor()/_ConvertSHWebColor()_DesktopDimensions()_DisplayPassword()_DotNet_Load()/_DotNet_Unload()_Fibonacci()_FileCompare()_FileCompareContents()_FileNameByHandle()_FilePrefix/SRE()_FindInFile()_GetBackgroundColor()/_SetBackgroundColor()_GetConrolID()_GetCtrlClass()_GetDirectoryFormat()_GetDriveMediaType()_GetFilename()/_GetFilenameExt()_GetHardwareID()_GetIP()_GetIP_Country()_GetOSLanguage()_GetSavedSource()_GetStringSize()_GetSystemPaths()_GetURLImage()_GIFImage()_GoogleWeather()_GUICtrlCreateGroup()_GUICtrlListBox_CreateArray()_GUICtrlListView_CreateArray()_GUICtrlListView_SaveCSV()_GUICtrlListView_SaveHTML()_GUICtrlListView_SaveTxt()_GUICtrlListView_SaveXML()_GUICtrlMenu_Recent()_GUICtrlMenu_SetItemImage()_GUICtrlTreeView_CreateArray()_GUIDisable()_GUIImageList_SetIconFromHandle()_GUIRegisterMsg()_GUISetIcon()_Icon_Clear()/_Icon_Set()_IdleTime()_InetGet()_InetGetGUI()_InetGetProgress()_IPDetails()_IsFileOlder()_IsGUID()_IsHex()_IsPalindrome()_IsRegKey()_IsStringRegExp()_IsSystemDrive()_IsUPX()_IsValidType()_IsWebColor()_Language()_Log()_MicrosoftInternetConnectivity()_MSDNDataType()_PathFull/GetRelative/Split()_PathSplitEx()_PrintFromArray()_ProgressSetMarquee()_ReDim()_RockPaperScissors()/_RockPaperScissorsLizardSpock()_ScrollingCredits_SelfDelete()_SelfRename()_SelfUpdate()_SendTo()_ShellAll()_ShellFile()_ShellFolder()_SingletonHWID()_SingletonPID()_Startup()_StringCompact()_StringIsValid()_StringRegExpMetaCharacters()_StringReplaceWholeWord()_StringStripChars()_Temperature()_TrialPeriod()_UKToUSDate()/_USToUKDate()_WinAPI_Create_CTL_CODE()_WinAPI_CreateGUID()_WMIDateStringToDate()/_DateToWMIDateString()Au3 script parsingAutoIt SearchAutoIt3 PortableAutoIt3WrapperToPragmaAutoItWinGetTitle()/AutoItWinSetTitle()CodingDirToHTML5FileInstallrFileReadLastChars()GeoIP databaseGUI - Only Close ButtonGUI ExamplesGUICtrlDeleteImage()GUICtrlGetBkColor()GUICtrlGetStyle()GUIEventsGUIGetBkColor()Int_Parse() & Int_TryParse()IsISBN()LockFile()Mapping CtrlIDsOOP in AutoItParseHeadersToSciTE()PasswordValidPasteBinPosts Per DayPreExpandProtect GlobalsQueue()Resource UpdateResourcesExSciTE JumpSettings INISHELLHOOKShunting-YardSignature CreatorStack()Stopwatch()StringAddLF()/StringStripLF()StringEOLToCRLF()VSCROLLWM_COPYDATAMore Examples...

Updated: 22/04/2018

Link to comment
Share on other sites

Sorry for the slow response on this one, new topics were being added quicker than i was going back to see older stuff... Seems like you could just...

#include<file.au3>;so you can use _FileReadToArray()...
Func DoIT($file,$delimiter);function should be called with a file handle (or filename, etc. check out file IO functions)
_FileReadToArray($file,$fileArray);Why reinvent the wheel, job's half done
If Not @error Then;bad file, etc could throw error on last call, so watch for it
    For $x = 0 to UBound($fileArray)-1;if no error then the array of contents is created so we will loop through the elements
        $fileArray[$x] = StringSplit($fileArray[$x],$delimiter);again, why reinvent the wheel we can already chop delimited strings
    Next; time for another iteration
    Return($fileArray);once it's done lets give the calling thread the data that it wants
EndIf;and we're done
EndFunc;that quick
Link to comment
Share on other sites

Hey thanks for the reply, always great to learn. But the example doesn't work as intended. It creates a blank 1D Array, when my intended output is a 2D Array with the Split content added to the columns. ;)

UDF List:

 
_AdapterConnections()_AlwaysRun()_AppMon()_AppMonEx()_ArrayFilter/_ArrayReduce_BinaryBin()_CheckMsgBox()_CmdLineRaw()_ContextMenu()_ConvertLHWebColor()/_ConvertSHWebColor()_DesktopDimensions()_DisplayPassword()_DotNet_Load()/_DotNet_Unload()_Fibonacci()_FileCompare()_FileCompareContents()_FileNameByHandle()_FilePrefix/SRE()_FindInFile()_GetBackgroundColor()/_SetBackgroundColor()_GetConrolID()_GetCtrlClass()_GetDirectoryFormat()_GetDriveMediaType()_GetFilename()/_GetFilenameExt()_GetHardwareID()_GetIP()_GetIP_Country()_GetOSLanguage()_GetSavedSource()_GetStringSize()_GetSystemPaths()_GetURLImage()_GIFImage()_GoogleWeather()_GUICtrlCreateGroup()_GUICtrlListBox_CreateArray()_GUICtrlListView_CreateArray()_GUICtrlListView_SaveCSV()_GUICtrlListView_SaveHTML()_GUICtrlListView_SaveTxt()_GUICtrlListView_SaveXML()_GUICtrlMenu_Recent()_GUICtrlMenu_SetItemImage()_GUICtrlTreeView_CreateArray()_GUIDisable()_GUIImageList_SetIconFromHandle()_GUIRegisterMsg()_GUISetIcon()_Icon_Clear()/_Icon_Set()_IdleTime()_InetGet()_InetGetGUI()_InetGetProgress()_IPDetails()_IsFileOlder()_IsGUID()_IsHex()_IsPalindrome()_IsRegKey()_IsStringRegExp()_IsSystemDrive()_IsUPX()_IsValidType()_IsWebColor()_Language()_Log()_MicrosoftInternetConnectivity()_MSDNDataType()_PathFull/GetRelative/Split()_PathSplitEx()_PrintFromArray()_ProgressSetMarquee()_ReDim()_RockPaperScissors()/_RockPaperScissorsLizardSpock()_ScrollingCredits_SelfDelete()_SelfRename()_SelfUpdate()_SendTo()_ShellAll()_ShellFile()_ShellFolder()_SingletonHWID()_SingletonPID()_Startup()_StringCompact()_StringIsValid()_StringRegExpMetaCharacters()_StringReplaceWholeWord()_StringStripChars()_Temperature()_TrialPeriod()_UKToUSDate()/_USToUKDate()_WinAPI_Create_CTL_CODE()_WinAPI_CreateGUID()_WMIDateStringToDate()/_DateToWMIDateString()Au3 script parsingAutoIt SearchAutoIt3 PortableAutoIt3WrapperToPragmaAutoItWinGetTitle()/AutoItWinSetTitle()CodingDirToHTML5FileInstallrFileReadLastChars()GeoIP databaseGUI - Only Close ButtonGUI ExamplesGUICtrlDeleteImage()GUICtrlGetBkColor()GUICtrlGetStyle()GUIEventsGUIGetBkColor()Int_Parse() & Int_TryParse()IsISBN()LockFile()Mapping CtrlIDsOOP in AutoItParseHeadersToSciTE()PasswordValidPasteBinPosts Per DayPreExpandProtect GlobalsQueue()Resource UpdateResourcesExSciTE JumpSettings INISHELLHOOKShunting-YardSignature CreatorStack()Stopwatch()StringAddLF()/StringStripLF()StringEOLToCRLF()VSCROLLWM_COPYDATAMore Examples...

Updated: 22/04/2018

Link to comment
Share on other sites

Hey thanks for the reply, always great to learn. But the example doesn't work as intended. It creates a blank 1D Array, when my intended output is a 2D Array with the Split content added to the columns. ;)

it's actually not a blank 1d array, it's an array of arrays, each element contains an array made of splitting said line number at the delimiter, rather than doing _ArrayDisplay($filearray), you'd have to do a loop to show _ArrayDisplay($filearray[$iterator])
Link to comment
Share on other sites

it's actually not a blank 1d array, it's an array of arrays, each element contains an array made of splitting said line number at the delimiter, rather than doing _ArrayDisplay($filearray), you'd have to do a loop to show _ArrayDisplay($filearray[$iterator])

and even though displaying it may appear a little more cumbersome, it could be argued that it is more efficient because you do not have blank columns if there are lines with differing numbers of columns.
Link to comment
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
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...