Jump to content

Recommended Posts

kartune

Hi, i would like to know if there is a possible way to use subsections for ini files?

For example, my ini file would look something like this:

 

Clientname.ini

[Info]

Country=USA

Type=Distributor

 

[Costs]

[[JAN]] <----- subsection

cost1=----

cost2=----

[[FEB]]

cost1=----

cost2=----

 

[Sales]

[[JAN]] <----- subsection

sale1=----

sale2=----

[[FEB]]

sale1=----

sale2=----

 

[Profits]

[[JAN]] <----- subsection

prof1=----

prof2=----

[[FEB]]

prof1=----

prof2=----

 

The sales would be inputed everyday by the script, and then whenever viewed, i would be using an array to view every sale/cost/profit under the subsection

 

 

Thanks for your time!

Share this post


Link to post
Share on other sites
Subz

In short no, however to get around this I would use something like below:

You can then use a function to create different reports based upon month or costs, profits, sales or both, simple example below:

#include <Array.au3>
#include <String.au3>

$aReportSection = _Report("", "JAN")
_ArrayDisplay($aReportSection)

$aReportSection = _Report("Costs", "FEB")
_ArrayDisplay($aReportSection)

$aReportSection = _Report("Profits", "")
_ArrayDisplay($aReportSection)


Func _Report($_sReport = "", $_sMonth = "")
    Local $sClient = @ScriptDir & "\Client.ini"
    Local $aSections = IniReadSectionNames($sClient)
        If @error Then Exit
    Local $aReportMonth, $aSection, $aResults[1][2]
    For $i = $aSections[0] To 1 Step - 1
        If $_sReport = "" And $_sMonth = "" Then
            _ArrayDelete($aSections, _ArraySearch($aSections, "Info"))
            ExitLoop
        EndIf
        $aReportMonth = StringSplit($aSections[$i], ":")
        ;~ Doesn't include seperator ":", so delete section name from array and continueloop
        If $aReportMonth[0] <= 1 Then
            _ArrayDelete($aSections, $i)
            ContinueLoop
        EndIf
        If $_sReport = "" Then
            If $_sMonth = $aReportMonth[2] Then ContinueLoop
            _ArrayDelete($aSections, $i)
        ElseIf $_sReport <> $aReportMonth[1] Then
            _ArrayDelete($aSections, $i)
        ElseIf $_sMonth = "" Then
            If $_sReport = $aReportMonth[1] Then ContinueLoop
            _ArrayDelete($aSections, $i)
        ElseIf $_sMonth <> $aReportMonth[2] Then
            _ArrayDelete($aSections, $i)
        EndIf
    Next
    $aSections[0] = UBound($aSections) - 1
    For $i = 1 To $aSections[0]
        $aSection = IniReadSection($sClient, $aSections[$i])
        $aReportMonth = StringSplit($aSections[$i], ":")
        For $j = 1 To $aSection[0][0]
            $aSection[$j][0] = _StringProper($aReportMonth[2]) & " - " & $aSection[$j][0]
        Next
        _ArrayConcatenate($aResults, $aSection, 1)
    Next
    $aResults[0][0] = $_sReport = "" ? "All Reports" : $_sReport & " Report"
    $aResults[0][1] = $_sMonth = "" ? "" : _Month($_sMonth)
    Return $aResults
EndFunc

Func _Month($_sMonth)
    Switch $_sMonth
        Case "JAN"
            Return "January"
        Case "FEB"
            Return "February"
        Case "MAR"
            Return "March"
        Case "APR"
            Return "April"
        Case "MAY"
            Return "May"
        Case "JUN"
            Return "June"
        Case "JUL"
            Return "July"
        Case "AUG"
            Return "August"
        Case "SEP"
            Return "September"
        Case "OCT"
            Return "October"
        Case "NOV"
            Return "November"
        Case "DEC"
            Return "December"
        Case Else
            Return ""
    EndSwitch
EndFunc
[Info]
Country=USA
Type=Distributor

[Costs:JAN]
cost1=----
cost2=----

[Costs:FEB]
cost1=----
cost2=----

[Sales:JAN]
sale1=----
sale2=----

[Sales:FEB]
sale1=----
sale2=----

[Profits:JAN]
prof1=----
prof2=----

[Profits:FEB]
prof1=----
prof2=----

 

Share this post


Link to post
Share on other sites
kartune

Wow thanks a lot!  That's some very nice code :)

Share this post


Link to post
Share on other sites
jdelaney
Posted (edited)

You can also have logic in your script that looks for a section by reading in a key's value.  where the value matches the sections name.  (just as another way to skin the cat)

 

Edited by jdelaney

IEbyXPATH-Grab IE DOM objects by XPATH IEscriptRecord-Makings of an IE script recorder ExcelFromXML-Create Excel docs without excel installed GetAllWindowControls-Output all control data on a given window.

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

    • AndreasNWWWWW
      By AndreasNWWWWW
      Hi, i'm curious if this is even possible, i want to do an action if the ini file contains current values under a section.
      for my test i'm looking for 100,200,300,400,500
      and if any of those excits i want to pop a msgbox with the number in the section.
      i can in my example find one, but it does not check everyone. why?  what am i missing?
      Local $iscore810[5] = [100,200,300,400,500] Local $iMax800 = 5 While 1 ;~     Send("{pause}") ;;func les ini fil     $var = IniReadSection("Area.ini", "modus")     If @error Then         MsgBox(4096, "Error", "Unable to read section.")     Else          For $number = 1 To $var[0][0] If $var[$number][1] == $iscore810[3] Then       MsgBox($MB_SYSTEMMODAL, "FAnt den på", $var[$number][0], 5) EndIf                       Next     EndIf     exit WEnd  
    • Pike
      By Pike
      Hello Everyone,
      New Guy here. This is a two-part question, hopefully easy enough though. I know it's ugly coding, this is because I have only a couple hours worth of coding experience and could really use some help.
      1) When I single click the button I want one action (like playing a sound clip) and when I double click the button I want a different action (such as opening dialogue box to ask for soundclip directory address). At the bottom of the script I made a comment which one I would like single click versus double click.
      2) I can not get the FileOpenDialogue to save the file address to the config.ini file at the 'One' position on the .ini.
      #include <ButtonConstants.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <MsgBoxConstants.au3> #include <FileConstants.au3> #include <AutoItConstants.au3> #include <Sound.au3> Opt('MustDeclareVars', 1) Opt("GUIOnEventMode", 1) Global $OneID _Main() Func _Main() GUICreate("Form1", 156, 86, 281, 276) $OneID = GUICtrlCreateButton("Button", 15, 17, 122, 37) GUICtrlSetOnEvent($OneID, "OnOne") GUISetOnEvent($GUI_EVENT_CLOSE, "OnExit") GUISetState() While 1 While 1 Sleep(1000) WEnd WEnd EndFunc ;---------------Functions------------- While 1 Sleep(100) WEnd Func OnOne() ; ******************Single Click for this action**************** $OneID = IniRead("config.ini", "Config", "One", $OneID) If $OneID = True Then SoundPlay($OneID, @HotKeyPressed) Else ; *******Double Click for this action*****And Help Saving File Address to config.ini 'One'*********** $OneID = FileOpenDialog("Select file", @WorkingDir, "All (*.*)") IniWrite("config.ini", "Config", "One", $OneID) $OneID = InputBox("Enter Information", "Short Name for File?", "") IniWrite("config.ini", "Config", "NameOne", $OneID) EndIf EndFunc Any help would be greatly appreciated, and if you need anymore clarity as to what exactly I'm trying to do, please do not hesitate to ask. Thanks so much!
      Pike
    • ercicttech
      By ercicttech
      Hello, all..

      My AutoIT is pretty terrible - but I get by with trawling here
      I came across an issue where i had to parse a large key in a large ini file, and found that I was victim of inireadsection's limit of "Only the first 32767 chars are read for legacy reasons."
       
      I've attempted to put together some terrible code that parses an ini section.
      It's absolutely nowhere near good, but I figured I'd put it here so that folk who know what they're doing can laugh at improve it.
      $Ini = @ScriptDir & "\bigini.ini" Dim $IniArray[0][2] $KeyName = "Person" $R = FileOpen($Ini, 0) $IniStr = FileRead($R) FileClose($R) $Start = StringInStr($iniStr, "[" & $KeyName & "]") If $Start = 0 then Msgbox(16, "Error", "String not found") Exit EndIf $Stop = StringInStr($IniStr, @CRLF & "[", 0, 1, ($Start + 1)) If $Stop = 0 then $Stop = StringLen($IniStr) EndIf $String = StringMid($IniStr, $Start, ($Stop - $Start)) $Split = StringSplit($String, @CRLF, 1) $KeyCount = 0 Dim $IniArray[65535][2] For $Loop = 1 to $Split[0] $Add = "Y" $Str = $Split[$Loop] $EQBreak = StringInStr($Str, "=") Select Case StringMid($Str, 1, 1) = ";" $Add = "N" Case $EQBreak = 0 $Add = "N" Case Else $Add = "Y" EndSelect If $Add = "Y" then $KeyCount = $KeyCount + 1 $Key = StringMid($Str, 1, ($EQBreak - 1)) $Val = StringMid($Str, ($EQBreak + 1)) $IniArray[$KeyCount][0] = $Key $IniArray[$KeyCount][1] = $Val EndIf Next Redim $IniArray[$KeyCount +1][2] ; Add the number of hits to 00 to match inireadsection $IniArray[0][0] = $KeyCount _ArrayDisplay($IniArray) ; Do stuff with the Array like you would inireadsection  
    • RC86
      By RC86
      Afternoon, I could very well be doing this wrong so feel free to totally advise otherwise - I'm wanting to use a GUI to first display a key from within an INI file, then secondly change the INI file by using a FileSelectFolder command but then I want to see the GUI change to reflect the change I've just made.
      #include <ButtonConstants.au3> #include <EditConstants.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #Region ### START Koda GUI section ### Form= $Form1 = GUICreate("Form1", 615, 437, 192, 124) $Input1 = GUICtrlCreateInput(Iniread(@WorkingDir & "\test.ini","Path","FilePath",""), 64, 80, 121, 21) $Button1 = GUICtrlCreateButton("Change", 200, 80, 75, 25) GUISetState(@SW_SHOW) #EndRegion ### END Koda GUI section ### While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit Case $Button1 $selectedFolder = FileSelectFolder("Select Log Path Directory",@WorkingDir,0) If NOT $selectedFolder = "" Then $newLogPath = IniWrite(@WorkingDir & "\test.ini","Path","FilePath",$selectedFolder) EndIf EndSwitch WEnd So 2 part question really: (1) Should I be using GUICtrlCreateInput to display my INI read from within the GUI? (2) How can I refresh the GUI to update that to read the new information I've just written to the GUI?
      Thanks!

    • LWC
      By LWC
      I've made a program that relies on IniReadSectionNames. It reads (~3K) Autorun.inf files in the working folder and creates a GUI based on their contents.
      I made sure to revert to a default GUI upon @error.
      But someone (with Windows XP SP3 32-bit) reported to me he always gets the default menu.
      I sent him a FileRead command instead and it works! So seemingly there's no access problem to AutoRun.inf.
      In the following demo code, I always hit success, but he always ends up with semi-success:
      Local $hIniLocation = "Autorun.inf" Local $aSections = IniReadSectionNames($hIniLocation) If @error Then $aSections = FileRead($hIniLocation) if @error then msgbox(48, "Double error", "Alternative access failed too due to:" & @crlf & @error & @crlf & @extended) else msgbox(0, "Semi-success", "IniReadSectionNames failed, but alternativaly this file contains:" & @crlf & @crlf & $aSections) endif else msgbox(0, "Success", "IniReadSectionNames worked!") endif Why is that? Is there something further to check with him?
      Autorun.inf
×