Wingens

Read and combine multiple sections inifile

4 posts in this topic

Hi I am trying to read multiple sections from an ini file into an array and use the result to calculate how many records there are from the suppliers and this devided into the status records that belong to it. The problem I am having; I am able to use Ubound to calculate how many record there are in total to the option chosen from the combo box, but where I am getting stuck is the part to link the status and leverancier to each other and count them.

Hope some one can help me.

My code right now:

#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <file.au3>
#include <array.au3>

$Form1 = GUICreate("Form1", 615, 437, 569, 253)
$LEVCOMBO = GUICtrlCreateCombo("", 184, 112, 145, 25, BitOR($CBS_DROPDOWNLIST, $WS_VSCROLL))

    Global $aSections = IniReadSectionNames(@ScriptDir & "\leveranciers.ini")
    If (Not @Error) Then GUICtrlSetData($LEVCOMBO, _ArraytoString($aSections, "|", 1), $aSections[1])

    $LABEL              = GUICtrlCreateLabel("Totaal aantal RMA aanvragen: ", 48, 200, 250, 21)
    $TOTALCOUNT         = GUICtrlCreateLabel("", 200, 200, 100, 21)
    $LABEL2             = GUICtrlCreateLabel("Aantal aangevraagd: ", 48, 225, 250, 21)
    $TOTALAANGEVRAAGD   = GUICtrlCreateLabel("", 200, 225, 100, 21)
    $LABEL3             = GUICtrlCreateLabel("Aantal verzonden: ", 48, 250, 250, 21)
    $TOTALVERZONDEN     = GUICtrlCreateLabel("", 200, 250, 100, 21)
    $LABEL4             = GUICtrlCreateLabel("Aantal afgehandeld: ", 48, 275, 250, 21)
    $TOTALAFGEHANDELD   = GUICtrlCreateLabel("", 200, 275, 100, 21)

GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $LEVCOMBO
            COMBO()
    EndSwitch
WEnd

Func COMBO()
    Local $hINI_FILENAME = @ScriptDir & "\ini.ini"
        $READAANGEVRAAGDRMA         = IniReadSection($hINI_FILENAME, 'LEVERANCIER')
        $READSTATUS                 = IniReadSection($hINI_FILENAME, 'STATUS')
        $VAR                        = GUICtrlRead($LEVCOMBO)
        $READAANGEVRAAGDRMACOUNT    = _ArrayFindAll($READAANGEVRAAGDRMA, $VAR, Default, Default, Default, Default, 1)
                                      GUICtrlSetData($TOTALCOUNT,UBound($READAANGEVRAAGDRMACOUNT))
        $nb = $READAANGEVRAAGDRMA[0][0]
            Local $res[$nb+1][3]
            $res[0][0] = $nb
                For $i = 1 to $nb
                    $res[$i][0] = $READAANGEVRAAGDRMA[$i][1]
                    $res[$i][1] = $READSTATUS[$i][1]
                Next
            _ArrayDisplay($res)
EndFunc

And the ini files that goes with it:

ini.ini:

[STATUS]
1=Afgehandeld
3=Verzonden
4=Aangevraagd
5=Aangevraagd
6=Aangevraagd
7=Aangevraagd
8=Verzonden
9=Aangevraagd
10=Aangevraagd
11=Aangevraagd
12=Aangevraagd
13=Aangevraagd
14=Aangevraagd
15=Aangevraagd
16=Aangevraagd
17=Aangevraagd
18=Aangevraagd
19=Aangevraagd
20=Aangevraagd
21=Aangevraagd
22=Aangevraagd

[LEVERANCIER]
9=Dobit B.V.
1=Dobit B.V.
10=Dobit B.V.
11=Dobit B.V.
12=Dobit B.V.
13=Dobit B.V.
14=Asus
15=Asus
16=Brother
17=Dobit B.V.
18=Dobit B.V.
19=Dobit B.V.
20=Dobit B.V.
21=Dobit B.V.
22=Asus

leveranciers.ini:

[Kies een leverancier...]

[Dobit B.V.]
URL =http://eline.dobit.be/eline/master.php
[TechData B.V.]
URL =   
[MaxICT B.V.]
URL =   
[Brother]
URL=
[Asus]
URL=https://eu-rma.asus.com/pickup_europe/pickup.aspx?country=nl
[HP]
URL=
[Lenovo]
URL=
[CCV]
URL=

 

test.au3

ini.ini

leveranciers.ini

Share this post


Link to post
Share on other sites



Can you what you are attempting to achieve?  

Share this post


Link to post
Share on other sites

Wingens,

I think this does what you want:

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <File.au3>
#include <Array.au3>
#include <GuiComboBox.au3>

$Form1 = GUICreate("Form1", 615, 437, 569, 253)
$LEVCOMBO = GUICtrlCreateCombo("", 184, 112, 145, 25, BitOR($CBS_DROPDOWNLIST, $WS_VSCROLL))
_GUICtrlComboBox_SetCueBanner($LEVCOMBO, "Kies een leverancier...") ; Remove this phrase from the ini file

Global $aSections = IniReadSectionNames(@ScriptDir & "\leveranciers.ini")
If (Not @error) Then GUICtrlSetData($LEVCOMBO, _ArrayToString($aSections, "|", 1), $aSections[1])

GUICtrlCreateLabel("Totaal aantal RMA aanvragen: ", 48, 200, 250, 21) ; Why store the ControlId if you are not going to use it again?
$TOTALCOUNT = GUICtrlCreateLabel("", 200, 200, 100, 21)
GUICtrlCreateLabel("Aantal aangevraagd: ", 48, 225, 250, 21)
$TOTALAANGEVRAAGD = GUICtrlCreateLabel("", 200, 225, 100, 21)
GUICtrlCreateLabel("Aantal verzonden: ", 48, 250, 250, 21)
$TOTALVERZONDEN = GUICtrlCreateLabel("", 200, 250, 100, 21)
GUICtrlCreateLabel("Aantal afgehandeld: ", 48, 275, 250, 21)
$TOTALAFGEHANDELD = GUICtrlCreateLabel("", 200, 275, 100, 21)

GUISetState(@SW_SHOW)

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case $LEVCOMBO
            _COMBO(GUICtrlRead($LEVCOMBO))
    EndSwitch
WEnd

Func _COMBO($VAR)
    
    Local $hINI_FILENAME = @ScriptDir & "\ini.ini"
    $READAANGEVRAAGDRMA = IniReadSection($hINI_FILENAME, 'LEVERANCIER')
    $READSTATUS = IniReadSection($hINI_FILENAME, 'STATUS')
    $READAANGEVRAAGDRMACOUNT = _ArrayFindAll($READAANGEVRAAGDRMA, $VAR, Default, Default, Default, Default, 1)
    ; Varibales to hold counts
    Local $TOTALAANGEVRAAGD_Sel = 0, $TOTALVERZONDEN_Sel = 0, $TOTALAFGEHANDELD_Sel = 0
    ; For each found index
    For $i = 0 To UBound($READAANGEVRAAGDRMACOUNT) - 1
        ; Check value of that index
        Switch $READSTATUS[$READAANGEVRAAGDRMACOUNT[$i]][1]
            Case "Aangevraagd"
                ; And adjust counts
                $TOTALAANGEVRAAGD_Sel += 1
            Case "Verzonden"
                $TOTALVERZONDEN_Sel += 1
            Case "Afgehandeld"
                $TOTALAFGEHANDELD_Sel += 1
        EndSwitch
    Next
    ; Set data in the labels
    GUICtrlSetData($TOTALCOUNT, $i)
    GUICtrlSetData($TOTALAANGEVRAAGD, $TOTALAANGEVRAAGD_Sel)
    GUICtrlSetData($TOTALVERZONDEN, $TOTALVERZONDEN_Sel)
    GUICtrlSetData($TOTALAFGEHANDELD, $TOTALAFGEHANDELD_Sel)

EndFunc   ;==>_COMBO

Come back if not.

M23


Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind._______My UDFs:

Spoiler

ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Share this post


Link to post
Share on other sites

Thanks Melba this is just what I was looking for.

You commented the label why I had a ControlID attached to it: in the full script I use it like this: 

GUICtrlSetBkColor($LABEL, $GUI_BKCOLOR_TRANSPARENT)

I need to do this because the GUI has an background image.

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

    • damon
      By damon
      @JLogan3o13 I apologize, I did not think of it that way.  I have attached all the code and the Ini File information.  Please let me know if I need to add anything else to help understand what is happening.  thank you.
       
       
       
      Guys, I apologize in advance as I did not search for my answer before posting.  I just could not figure out a way to search that made since so I decided to go ahead and post my question.
       
      Getting to it.
      Background: this is being used to validate file names before moving to a new location.  though i have not included all the code, below is what i am having a problem with.
       I have an ini file that i am reading values from. Func ConfigDefineVars() -- I read the value of $ValidationRDA and everything is good then I set 
      $CaseRDALocationCheck = '$SplitFile[$ValidationRDALocation]' <> $ValidationRDA
      the code that will be used in the select case in Func FileSplitCount().  The problem i have is that even though the numbers = each other they are not recognizing as =.  
      This is what i am getting in my log file i create.
      2017-12-04 14:09:53 : RDA was 2403 should have been 2403:
      If I move $SplitFile[$ValidationRDALocation] <> $ValidationRDA to the Case line under the function it works correctly.
       
      I think this has to do with my use of ' ' around the '$SplitFile[$ValidationRDALocation]' but  i don't know what option i have in Func ConfigDefineVars I am not ready to define $SplitFile.  I have tried adding it to my Global Vars at the top of my script but that did not seem to help.
      There will be more fail this is just the first one in the select case.
       
      Any help or ideas would be greatly appreciated.
       
      thanks,
      Damon
      Example of a filename used.
      DWRSSD-37087-95-026.%-064.00-Tatum Family %-%-1230 Academy Rd-%-PERM-TRUE-2403.pdf
      This file will fail on the 95, it should be 095.  The problem i am getting is with the 2403 it fails even though the ini file value ValidationRDA = 2403 
       
       
      Ini File:
      [SSD_FolderPaths]
      pendingFolder=C:\Users\bg01152\Desktop\SSD Test\pending
      reviewFolder=C:\Users\bg01152\Desktop\SSD Test\review
      completedFolder=C:\Users\bg01152\Desktop\SSD Test\Completed
      FileNetProperties=DocumentTitle,ZipCode,County,MapAndGroupID,ParcelID,PropertyOwner,Subdivision,StreetAddress,LotNumber,DocumentType,Approved,RDANumber
      ValidationDocumentTitle=DWRSSD
      ValidationDocumentTitleLocation=1
      ValidationCountyCodeLocation=3
      ValidationRDA=2403
      ValidationRDALocation=12
      Validation3=TRUE
      Validation3Location=11
      Validation4=PERM
      Validation4Location=10
       
       
      #include <Array.au3> #include <File.au3> #include <MsgBoxConstants.au3> ;------------Global Vars --------------------- Global $SplitFile, $aFileList, $FileLog, $dFolder, $sFolder, $cFolder, $ConfigFile, $t Global $ValidationDocumentTitle, $ValidationDocumentTitleLocation, $ValidationCountyCodeLocation, $ValidationRDA Global $ValidationRDALocation, $Validation3, $Validation3Location, $Validation4, $Validation4Location, $FileNetPropertiesSplit Global $CaseCountyCheck, $CaseRDALocationCheck, $CaseValidation3LocationCheck, $CaseValidation4LocationCheck, $SplitFile ;;--------------------------------Check and Read Config files-------------------------------- $SysConfigFile = @ScriptDir & "\SysConfig.ini" ;----------------PreCheck for Config File-------------- If FileExists ($SysConfigFile) <> 1 Then Exit EndIf ;----------------End PreCheck-------------------------- $FileNetEXE = @ScriptDir & "\" & IniRead ($SysConfigFile, "FileNetUploader","FileName","") $delimiter = IniRead ($SysConfigFile, "FileInformation", "Delimiter","") $Filter = IniRead ($SysConfigFile, "FileInformation", "Filter", "") $ConfigFile = @ScriptDir & "\Config.ini" ;----------------PreCheck for Config File-------------- If FileExists ($ConfigFile) <> 1 Then Exit EndIf ;----------------End PreCheck-------------------------- ;;-------------------------------------------------------------------------------------------- $Sections = IniReadSectionNames ($ConfigFile) ;MsgBox (0,"test", $Sections[0] & @CRLF & $Sections[1] & @CRLF & $Sections[2] & @CRLF & $Sections[3] & @CRLF & $Sections[4]);TESTING ONLY - DELETE WHEN DONE $p = 0 Do $t = 0 ;used for precheck $p = $p + 1 ConfigDefineVars($Sections[$p]) ;MsgBox(0,"ConfigDefineVars", $sFolder & @CRLF & $dFolder & @CRLF & $cFolder);TESTING ONLY - DELETE WHEN DONE PreCheck($dFolder, $sFolder, $cFolder) ;Runs a Pre-check to make sure folder structure exists before running the program If $t = 0 Then ;MsgBox(0,"PreCheck Run", "Running next functions");TESTING ONLY - DELETE WHEN DONE ListArray($sFolder, $Filter) ;Puts File Names in String Array ;_ArrayDisplay ($aFileList, $Sections[$p]) If $t = 0 Then FileSplitCount($dFolder, $aFileList) ;Takes filename String Array and splits by $delimiter ;MsgBox(0,"PreCheck Run2", "Running split function");TESTING ONLY - DELETE WHEN DONE Else ;MsgBox(0,"PreCheck Run2", "Skipping split function");TESTING ONLY - DELETE WHEN DONE EndIf Else ;MsgBox(0,"PreCheck Run", "Skipping next functions");TESTING ONLY - DELETE WHEN DONE EndIf Until $p = $Sections[0] ExitScript() ;Exit script Function Func ConfigDefineVars($SectionsNum);Defines Variables from config file Sections $sFolder = IniRead ($ConfigFile, $SectionsNum, "pendingFolder","") ;Pending Folder, Folder that is awaiting the process $dFolder = IniRead ($ConfigFile, $SectionsNum, "reviewFolder","") ;Review Folder, Files that did not pass validation check and division needs to review $cFolder = IniRead ($ConfigFile, $SectionsNum, "completedFolder","") ;Completed Folder, Once process is completed this would be location files get moved to $FileNetProperties = IniRead ($ConfigFile, $SectionsNum, "FileNetProperties","") $FileNetPropertiesSplit = StringSplit ($FileNetProperties,",") $ValidationDocumentTitle = IniRead ($ConfigFile, $SectionsNum, "ValidationDocumentTitle","") $ValidationDocumentTitleLocation = IniRead ($ConfigFile, $SectionsNum, "ValidationDocumentTitleLocation","") $ValidationCountyCodeLocation = IniRead ($ConfigFile, $SectionsNum, "ValidationCountyCodeLocation","") $ValidationRDA = IniRead ($ConfigFile, $SectionsNum, "ValidationRDA","") $ValidationRDALocation = IniRead ($ConfigFile, $SectionsNum, "ValidationRDALocation","") $Validation3 = IniRead ($ConfigFile, $SectionsNum, "Validation3","") $Validation3Location = IniRead ($ConfigFile, $SectionsNum, "Validation3Location","") $Validation4 = IniRead ($ConfigFile, $SectionsNum, "Validation4","") $Validation4Location = IniRead ($ConfigFile, $SectionsNum, "Validation4Location","") If $ValidationCountyCodeLocation = 999 Then $CaseCountyCheck = 1 <> 1 Else ;MsgBox (0,"test of county code", "location = " &$ValidationCountyCodeLocation) $CaseCountyCheck = StringLen('$SplitFile[$ValidationCountyCodeLocation]') <> 3 ; Checks for 3 digit County Code EndIf If $ValidationRDALocation = 999 Then $CaseRDALocationCheck = 1 <> 1 Else $CaseRDALocationCheck = '$SplitFile[$ValidationRDALocation]' <> $ValidationRDA ; Checks for 4 Digit RDA EndIf If $Validation3Location = 999 Then $CaseValidation3LocationCheck = 1 <> 1 Else $CaseValidation3LocationCheck = '$SplitFile[$Validation3Location]' <> $Validation3 ; Checks that Approved = True EndIf If $Validation4Location = 999 Then $CaseValidation4LocationCheck = 1 <> 1 Else $CaseValidation3LocationCheck = '$SplitFile[$Validation4Location]' <> $Validation4 ; Checks that Document Type = PERM EndIf EndFunc Func ValidationCheck ($check1) $blank = StringLen ($check1) If $check1 Then EndIf EndFunc Func PreCheck($dFolder, $sFolder, $cFolder) ;----------------PreCheck for Destination Folder-------------- If FileExists ($dFolder) <> 1 Then $t = 1 Return Else $FileLog = FileOpen($dFolder & "\FileLog.log", 1) EndIf ;----------------End PreCheck-------------------------- ;----------------PreCheck for Source Folder-------------- If FileExists ($sFolder) <> 1 Then _FileWriteLog($FileLog, "Path to Pending Folder -- " & $sFolder & " -- does not exist") $t = 1 Return EndIf ;----------------End PreCheck-------------------------- ;----------------PreCheck for Completed Folder--------- If FileExists ($cFolder) <> 1 Then _FileWriteLog($FileLog, "Path to Completed Folder -- " & $cFolder & " -- does not exist") $t = 1 Return EndIf ;----------------End PreCheck-------------------------- EndFunc Func ListArray($sFolder, $Filter) $aFileList = _FileListToArray($sFolder, $Filter, 1) ;Create an array of files from the source folder filtering by filetype ;in the config.ini files for the specified section If @error = 1 Then ;MsgBox($MB_SYSTEMMODAL, "", "Path was invalid.") _FileWriteLog($FileLog, "Path to File(s) is Invalid") $t = 1 Return EndIf If @error = 4 Then ;MsgBox($MB_SYSTEMMODAL, "", "No file(s) were found.") _FileWriteLog($FileLog, "No File(s) were found, exiting.") $t = 1 Return EndIf EndFunc ;==>ListArray  
       
       
       
    • 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  
    • chacoya121
      By chacoya121
      plz help how to organize information from notepad or INIfile
      Example:
      0=000308 1=000308 2=000308 3=000308 4=000408 5=000408 6=000408 7=000408 8=000408 9=000408 10=000308 11=000308 12=000308 13=000408 14=000408 15=000408 16=000408 17=000408 18=000408 19=000408 20=000308 21=000308 22=000308 23=000408 24=000408 25=000408 26=000408 27=000408 28=000408 29=000408 30=000308  0=000308 x 11 total
       1=000408 x 20 total
      2 lines summary all
       
      Thank you
       
    • TheDcoder
      By TheDcoder
      Hello , I was thinking of a situation where a key in a ini file can contain anything, If we were to know if the key does not exists using IniRead, Its not possible to do it without compromising a single possibility... I was thinking that if IniRead were to set @error when a key does not exist, it solves the problem which I mentioned before
       
      What do you think? Would you like this feature?
      TD
    • zemkor
      By zemkor
      Hello, i have question. How to save and read data from "GUICtrlCreateEdit" to ini file ?. Problem is: IniWrite write only first line of text and IniRead read only first line text.
      How to do it?
      Thanks for answer.
      $text = GUICtrlCreateEdit("Text", 20, 165, 120, 50) Func save() Local $ini_file, $workingdir ; save workingdir $workingdir = @WorkingDir ; save file dialog $ini_file = FileSaveDialog('Save', @ScriptDir, 'Ini (*.ini)|All (*.*)', 10, 'Config.ini', $Form1) ; check if return is valid If @error Or $ini_file == '' Then FileChangeDir($workingdir) Return SetError(1, 0, '') EndIf ; write to ini file IniWrite($ini_file, "Data", "Text", GUICtrlRead($Text)) EndFunc $text = GUICtrlCreateEdit("Text", 20, 165, 120, 50) Func load() ;natiahne nastavenia z .ini Local $ini_file, $workingdir ; save workingdir $workingdir = @WorkingDir ; open file dialog $ini_file = FileOpenDialog('Open', @ScriptDir, 'Ini (*.ini)|All (*.*)', 1, 'Config.ini', $Form1) ; check if return is valid If @error Or $ini_file == '' Then FileChangeDir($workingdir) Return SetError(1, 0, '') EndIf ; read from ini file GUICtrlSetData($text, IniRead($ini_file, "Data", "Text", "")) EndFunc This not working, read and write only firt line