Jump to content

Recommended Posts

Posted

Hi,

 

I have a property file format configuration file for our project.

The sample file is as below.

BuildLocation:C:\Build
BuildExe:erwin Data Modeler r9.7 (64-bit)_2378.exe
Release:r9.64.02
Silent:No
InstallPath:default
Compare :No
MartUpgrade :Yes
Bit:64
ERwinUpgrade:No
License_File:150416-1952 Navigator (ca.com).lic

To read this file, I am using below code.

Func readConfig($sFilePath,$intStartCode)

;Usage: MsgBox(0,"Silent",readConfig(@ScriptDir&"\Config.txt","Silbent"))

;$sReplaceText = "Mani Prakash"
;$sFilePath = "C:\Users\KIRUD01\Desktop\Config.txt"
;$intStartCode = "BuildExe"
$arrRetArray = ""
$s = _FileReadToArray($sFilePath, $arrRetArray);Reading text file and saving it to array $s will show status of reading file..
    For $i = 1 To UBound($arrRetArray)-1
        $line = $arrRetArray[$i];retrieves taskengine text line by line
        If StringInStr($line, $intStartCode) Then
                ConsoleWrite ("Starting point "& $line &  @CRLF)
                return StringStripWS(StringSplit($line,":")[2],$STR_STRIPLEADING + $STR_STRIPTRAILING )
        EndIf
        if $i = UBound($arrRetArray)-1 then return "Not Found"
    Next
EndFunc

The above code is working to read the particular key value.

But problem is , if I try to read the key "Bit" it is giving the value of key "BuildExe" as the line contains the word "bit"..

Can you suggest how to do this. 

 

If possible I need to fix writeConfig also.

 

Func writeConfig($sFilePath,$intStartCode,$sReplaceText)

;$sReplaceText = "Mani Prakash"
;$sFilePath = "C:\Users\KIRUD01\Desktop\Config.txt"
;$intStartCode = "BuildExe"
$arrRetArray = ""
$s = _FileReadToArray($sFilePath, $arrRetArray);Reading text file and saving it to array $s will show status of reading file..
$intStartingPointFound = 0
    For $i = 1 To UBound($arrRetArray)-1
        $line = $arrRetArray[$i];retrieves taskengine text line by line
        If StringInStr($line, $intStartCode) Then
                $intStartingPointFound = 1;if found the starting point of the module to copy then set this variable to 1
                ConsoleWrite ("Starting point " &  @CRLF)
                $arrRetArray[$i] = $intStartCode & ": " & $sReplaceText
                ExitLoop
        EndIf
        if $i = UBound($arrRetArray)-1 then ConsoleWrite("Not Found" & @CRLF)
    Next
_FileWriteFromArray ($sFilePath, $arrRetArray,1)

EndFunc

 

  • Moderators
Posted

ur,

Why not use the ini format for your config file? That is what the format is designed to do and then you can use the built-in INI* functions to access the settings and the problem goes away.

If you insist on your current file format, then you need to add ":" to the end of the StringInStr search string to ensure that the search is against the key and not the whole line.

And what is wrong with the "write" code?

M23

Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png 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:

  Reveal hidden contents

 

Posted

The confuration file format our project is using from long time.

Even I also suggested them to change them to ini format, we are changing that but to support old and existing files, we need to implement for this format also.

at present no issue with writeConfig, I thought this readConfig issue might effect somewhere the logic of writeConfig also if the same string of key is found.

One more doubt with the logic you told, if I search "bit:" it might not detect if there is space in between key and value pair like "bit  : 64".

Can you tell how to fix this also.

  • Moderators
Posted

ur,

I was afraid changing the file format might not be possible.

If you have spaces in the line then just use StringStripWS to remove them:

#include <StringConstants.au3>

; Simulate reading file into an array
Global $aLines[] = [10, _
        "BuildLocation:C:\Build", _
        "BuildExe : erwin Data Modeler r9.7 (64-bit)_2378.exe", _
        "Release:r9.64.02", _
        "Silent:No", _
        "InstallPath:default", _
        "Compare :No", _
        "MartUpgrade :Yes", _
        "Bit : 64", _
        "ERwinUpgrade:No", _
        "License_File:150416-1952 Navigator (ca.com).lic"]

$intStartCode = "Bit"

For $i = 1 To $aLines[0]

    $line = $aLines[$i]

    If StringInStr(StringStripWS($line, $STR_STRIPALL), $intStartCode & ":") Then
        ConsoleWrite ("Starting point "& $line &  @CRLF)
        ConsoleWrite(StringStripWS(StringSplit($line,":")[2], $STR_STRIPLEADING + $STR_STRIPTRAILING) & @CRLF)
        ; No point in searching further
        ExitLoop
    EndIf

Next

M23

Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png 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:

  Reveal hidden contents

 

Posted (edited)

Thanks @Melba23

I have changed the codeblock for writeConfig also as per your logic.

Func readConfig($sFilePath,$intStartCode)

;Usage: MsgBox(0,"Silent",readConfig(@ScriptDir&"\Config.txt","Silbent"))

;$sReplaceText = "Mani Prakash"
;$sFilePath = "C:\Users\KIRUD01\Desktop\Config.txt"
;$intStartCode = "BuildExe"
$arrRetArray = ""
$s = _FileReadToArray($sFilePath, $arrRetArray);Reading text file and saving it to array $s will show status of reading file..
    For $i = 1 To UBound($arrRetArray)-1
        $line = $arrRetArray[$i];retrieves taskengine text line by line
        ;If StringInStr($line, $intStartCode) Then
        If StringInStr(StringStripWS($line, $STR_STRIPALL), $intStartCode & ":") Then
                ConsoleWrite ("Starting point "& $line &  @CRLF)
                return StringStripWS(StringSplit($line,":")[2],$STR_STRIPLEADING + $STR_STRIPTRAILING )
        EndIf
        if $i = UBound($arrRetArray)-1 then return "Not Found"
    Next
EndFunc

Func writeConfig($sFilePath,$intStartCode,$sReplaceText)

;$sReplaceText = "Mani Prakash"
;$sFilePath = "C:\Users\KIRUD01\Desktop\Config.txt"
;$intStartCode = "BuildExe"
$arrRetArray = ""
$s = _FileReadToArray($sFilePath, $arrRetArray);Reading text file and saving it to array $s will show status of reading file..
$intStartingPointFound = 0
    For $i = 1 To UBound($arrRetArray)-1
        $line = $arrRetArray[$i];retrieves taskengine text line by line
        ;If StringInStr($line, $intStartCode) Then
        If StringInStr(StringStripWS($line, $STR_STRIPALL), $intStartCode & ":") Then
                $intStartingPointFound = 1;if found the starting point of the module to copy then set this variable to 1
                ConsoleWrite ("Starting point " &  @CRLF)
                $arrRetArray[$i] = $intStartCode & ": " & $sReplaceText
                ExitLoop
        EndIf
        if $i = UBound($arrRetArray)-1 then ConsoleWrite("Not Found" & @CRLF)
    Next
_FileWriteFromArray ($sFilePath, $arrRetArray,1)

EndFunc

 

Edited by ur

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
×
×
  • Create New...