IniReadSection Größenbeschränkung

  • Moin,
    ich habe folgendes Problem. Ich möchte eine Ini-Sektion auslesen, welche über 600 Zeilen hat. Die Parameter lauten 'Dateixxx', wobei xxx eine fortlaufende Zahl ist. Als Werte stehen dahinter vollqualifizierte Dateinamen (inkl. Pfad). Somit wird ziemlich schnell der Genzwert der Funktion IniReadSection von 32536 Byte überschritten. :cursing:
    Hat sich schon jemand mit dieser Problematik beschäftigt und eine eigene Funktion ohne Größenlimit geschrieben?

    Danke für die schnellen Antworten.

    Gruß, Grandpa

    Einmal editiert, zuletzt von Grandpa (26. August 2010 um 08:11)

  • Hier... Das ganze kann auch "kaputte" Ini's auslesen... denke ich...

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    $sText = _
    "[Section]" & @CRLF & _
    "Datei232 = Wert 1" & @CRLF & _
    "Datei233 =" & @CRLF & _
    "Datei234 = Wert 3" & @CRLF & _
    "Datei235= Wert 4" & @CRLF & _
    "Datei236 =Wert 5" & @CRLF & _
    "Datei237=Wert 6" & @CRLF & _
    "= Wert 7" & @CRLF
    ;~ $sText = FileRead(@ScriptDir & "\pfadzurini.ini")

    [/autoit] [autoit][/autoit] [autoit]

    $aRet = _RegExp($sText, '(.*?)\h*=\h*([^\v]*)')
    _ArrayDisplay($aRet)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _RegExp($sTest, $sPattern, $iOffset = 0)
    ; Easy RegExp with >1 Subpattern (SEuBo)
    Local $aRet, $iUB, $iUB2, $aDummy, $aNewArr
    $aRet = StringRegExp($sTest, $sPattern, 4, $iOffset)
    If @error Then Return ConsoleWrite(@extended & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    Local $iUB = UBound($aRet), $iUB2 = UBound($aRet[0]), $aNewArr[$iUB][$iUB2 - 1]
    For $i = 0 To $iUB - 1
    Local $aDummy = $aRet[$i], $iUBD = UBound($aDummy)

    [/autoit] [autoit][/autoit] [autoit]

    If $iUBD - 1 > $iUB2 Then
    $iUB2 = $iUBD
    ReDim $aNewArr[$iUB][$iUB2]
    EndIf
    For $j = 1 To $iUBD - 1
    $aNewArr[$i][$j - 1] = $aDummy[$j]
    Next
    Next
    Return $aNewArr
    EndFunc ;==>_RegExp

    [/autoit]
  • Hmm ...
    Sprenger120
    Da es sich um ein größeres Projekt handelt, kann ich nicht das ganze Konzept über den Haufen werfen und auf txt-Files umschwenken. Es müssen also ini-Files sein.

    SEuBo
    Der Ansatz ist nicht schlecht. Leider ist es damit nicht möglich eine spezielle Sektion auszulesen. Somit also auch suboptimal.

    Dennoch danke an euch beide.

    Ich werde wahrscheinlich was selber schreiben, was erstmal die gesamte ini in ein Array läd (FileReadLine in ner For-Schleife - hab ich bereits ne Funktion für) und anschließend dieses Array nach '[' und dem übergebenen Sektionsnamen parsed. Wird diese Kombi gefunden, wird ein Flag gesetzt. Ist das Flag gesetzt, werden alle nächsten Zeilen (Array-Einträge) bis zum nächsten Array-Eintrag, welcher mit '[' beginnt, in einem anderen Array gespeichert und das Flag anschließend zurücksetzt.
    Diese Version wird zwar wesentlich langsamer sein, dafür mit gleichen Parametern wie IniReadSection arbeiten und gleiche Rückgabewerte haben.

    Gruß, Grandpa

  • Leider ist es damit nicht möglich eine spezielle Sektion auszulesen. Somit also auch suboptimal.


    Naja daran solls nicht scheitern - das ist eine Zeile mehr die man schreiben muss. Hier mal in ne Funktion verpackt:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    $sText = "[Section]" & @CRLF & "Datei232 = Wert 1" & @CRLF & "Datei233 =" & @CRLF & "Datei234 = Wert 3" & @CRLF & "Datei235= Wert 4" & @CRLF & "Datei236 =Wert 5" & @CRLF & "Datei237=Wert 6" & @CRLF & "= Wert 7" & @CRLF & "" & @CRLF & "[Section2]" & @CRLF & "Datei232 = Wert 1" & @CRLF & "Datei233 =" & @CRLF & "Datei234 = Wert 3" & @CRLF & "Datei235= Wert 4" & @CRLF & "Datei236 =Wert 5" & @CRLF & "Datei237=Wert 6" & @CRLF & "= Wert 7" & @CRLF & "" & @CRLF & "[Section3]" & @CRLF & "Datei232 = Wert 1" & @CRLF & "Datei233 =" & @CRLF & "Datei234 = Wert 3" & @CRLF & "Datei235= Wert 4" & @CRLF & "Datei236 =Wert 5" & @CRLF & "Datei237=Wert 6" & @CRLF & "= Wert 7"
    FileDelete(@ScriptDir & "\testini.ini")
    FileWrite(@ScriptDir & "\testini.ini",$sText)
    ShellExecuteWait(@ScriptDir & "\testini.ini")

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $aRet = _IniReadSection(@ScriptDir & "\testini.ini",'Section3')
    _ArrayDisplay($aRet)

    [/autoit] [autoit][/autoit] [autoit]

    Func _IniReadSection($sPath,$sSection)
    Local $sText, $aSection, $aRet
    $sText = FileRead($sPath)
    $aSection = StringRegExp($sText,'(?is)\Q['&$sSection&']\E(.+?)(?:\[|$)',1)
    If Not @error Then Return _RegExp($aSection[0], '(.*?)\h*=\h*([^\v]*)')
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _RegExp($sTest, $sPattern, $iOffset = 0)
    ; Easy RegExp with >1 Subpattern (SEuBo)
    Local $aRet, $iUB, $iUB2, $aDummy, $aNewArr
    $aRet = StringRegExp($sTest, $sPattern, 4, $iOffset)
    If @error Then Return ConsoleWrite(@extended & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    Local $iUB = UBound($aRet), $iUB2 = UBound($aRet[0]), $aNewArr[$iUB][$iUB2 - 1]
    For $i = 0 To $iUB - 1
    Local $aDummy = $aRet[$i], $iUBD = UBound($aDummy)

    [/autoit] [autoit][/autoit] [autoit]

    If $iUBD - 1 > $iUB2 Then
    $iUB2 = $iUBD
    ReDim $aNewArr[$iUB][$iUB2]
    EndIf
    For $j = 1 To $iUBD - 1
    $aNewArr[$i][$j - 1] = $aDummy[$j]
    Next
    Next
    Return $aNewArr
    EndFunc ;==>_RegExp

    [/autoit]
  • THX @ SEuBo
    Funzt super. Auch wenn ich noch nicht zu 100% Zeile 14 ($aSection = StringRegExp($sText,'(?is)\Q['&$sSection&']\E(.+?)(?:\[|$)',1)) durchschaut habe. Das rote bedeutet doch alles außer [ oder $. Oder verstehe ich das falsch? Bei einem Test mit $ am Anfang gabs keine Probleme, was meinem Verständnis widerspricht.

    Hmm, egal. Hauptsache funzt. :rock:

    Nochmal danke. :thumbup:


  • Sorry, aber nöö. Das Skript, was in dem anderen Forum vorgestellt wird, ist zum auslesen von bestimmten Sektionsparametern gedacht (Func _IniReadEx($hFile, $vSection, $vKey, $vDefault = -1)
    ). Das, was SEuBo gepostet hat, hat es schon sehr gut getroffen. An den pattern wurde zwar noch etwas angepasst, aber im Großen und Ganzen entsprach es dem, was ich gesucht hatte.

    Und da das Problem gelöst ist, kann dieser Thread geschlossen werden. *zu Mod schiel*

  • Threads werden hier nicht geschlossen wegen eventueller Rückfragen.

    Aber du könntest den Thread selbst auf gelöst setzen.
    Einfach ersten Post bearbeiten, gelöst als Präfix wählen und Absenden drücken ;)

  • Das rote bedeutet doch alles außer [ oder $.


    Nein, das bedeutet entweder [ (was die nächste Section wäre) oder $ was für das String- oder in unserem Fall Dateiende steht.

    Alles außer [ und $ wäre das hier:

    Code
    [^[$]


    oder das, wenn man's genau nimmt

    Code
    [^\[\$]
  • Mahlzeit dann frische ich das Thema mal wieder auf... :)
    Ich bin nun auch an die Grenzen von Iniread gestossen, :wacko:
    habe dann aber die Lösung von Seubo entdeckt wodurch ein weiterer Thread zu max Größe von Inreadsection vermieden wurde. :thumbup:

    Habe nun aber ein Problem was ich nicht verstehe, eins ? Nun ja eins wo Ihr mir sicher helfen könnt ;)

    Es wird bei Seubo Variante eine Section unterschagen und ich kann mir nicht erklären warum, im Orginal unterscheiden die sich nur durch DE-DE EN-US am Ende.
    Habe testweise einen weiteren Eintrag hinzugekommen, nach Steuerzeichen geschaut... alle Zeilen enden auf ^M soweit also auch ok.

    Habe da nun mal was vorbereitet und vielleicht sieht einer warum es so ist und wie man es löst.

    Spoiler anzeigen
    [autoit]


    #include <array.au3>
    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $file = @ScriptDir & "\test.ini"
    $Version = "dummy"
    $Foldernames = IniReadSectionNames($file)

    [/autoit] [autoit][/autoit] [autoit]

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Warum wird bei der Max Variante \Programm\Bin\7.3\EN-US\ unterschlagen?", 601, 126, 192, 124)
    $Button1 = GUICtrlCreateButton(" Iniread_classic (incl.\Programm\Bin\7.3\EN-US\ ! ) ", 32, 22, -1, 49, $WS_GROUP)
    $Button2 = GUICtrlCreateButton(" Iniread_max (excl.\Programm\Bin\7.3\EN-US\ ? ) ", 330, 22, -1, 49, $WS_GROUP)
    $Chbox_Array = GUICtrlCreateCheckbox("Arraydisplay ein- / ausschalten",40,80,-1,25)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    For $i = 1 to UBound($Foldernames,1) -1
    ConsoleWrite($Foldernames[$i] & @CRLF)
    $files = IniReadSection($file,$Foldernames[$i])
    If GUICtrlRead($Chbox_Array) = 1 Then _ArrayDisplay($files)

    [/autoit] [autoit][/autoit] [autoit]

    For $j = 1 to UBound($files,1) -1
    $file_val = "'" & $Version & "','" & $files[$j][0] & "'," & StringReplace(StringReplace($files[$j][1],'"',"'"),"|","','") & ",'" & $Foldernames[$i] & "'"
    ConsoleWrite($file_val & @CRLF & "'" & $Version & "','" & $files[$j][0] & "'," & StringReplace(StringReplace($files[$j][1],'"',"'"),"|","','") & ",'" & $Foldernames[$i] & "'" & @CRLF)
    Next
    Next
    Case $Button2
    For $i = 1 to UBound($Foldernames,1) -1
    ConsoleWrite($Foldernames[$i] & @CRLF)
    $files = _IniReadSectionMax($file,$Foldernames[$i])
    If GUICtrlRead($Chbox_Array) = 1 Then _ArrayDisplay($files)

    [/autoit] [autoit][/autoit] [autoit]

    For $j = 0 to UBound($files,1) -1
    $file_val = "'" & $Version & "','" & $files[$j][0] & "'," & StringReplace(StringReplace($files[$j][1],'"',"'"),"|","','") & ",'" & $Foldernames[$i] & "'"
    ConsoleWrite($file_val & @CRLF & "'" & $Version & "','" & $files[$j][0] & "'," & StringReplace(StringReplace($files[$j][1],'"',"'"),"|","','") & ",'" & $Foldernames[$i] & "'" & @CRLF)
    Next
    Next
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _IniReadSectionMax($sPath,$sSection) ; Thx to SEuBo
    Local $sText, $aSection, $aRet
    $sText = FileRead($sPath)
    $aSection = StringRegExp($sText,'(?is)\Q['&$sSection&']\E(.+?)(?:\[|$)',1)
    If Not @error Then Return _RegExp($aSection[0], '(.*?)\h*=\h*([^\v]*)')
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _RegExp($sTest, $sPattern, $iOffset = 0) ; Thx to SEuBo
    ; Easy RegExp with >1 Subpattern (SEuBo)
    Local $aRet, $iUB, $iUB2, $aDummy, $aNewArr
    $aRet = StringRegExp($sTest, $sPattern, 4, $iOffset)
    If @error Then Return ConsoleWrite(@extended & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    Local $iUB = UBound($aRet), $iUB2 = UBound($aRet[0]), $aNewArr[$iUB][$iUB2 - 1]
    For $i = 0 To $iUB - 1
    Local $aDummy = $aRet[$i], $iUBD = UBound($aDummy)

    [/autoit] [autoit][/autoit] [autoit]

    If $iUBD - 1 > $iUB2 Then
    $iUB2 = $iUBD
    ReDim $aNewArr[$iUB][$iUB2]
    EndIf
    For $j = 1 To $iUBD - 1
    $aNewArr[$i][$j - 1] = $aDummy[$j]
    Next
    Next
    Return $aNewArr
    EndFunc ;==>_RegExp

    [/autoit]


    Inhalt der test.ini

    Spoiler anzeigen

    Aufgefallen war es mir weil ein select count(*) auf die Tabelle nicht die Zeilenanzahl lieferte wie Anzahl Zeilen - Sectionsnamen.
    Mit Iniread wurde von einer Sektion die Hälfte nicht übertragen von daher wollte ich noch mal nachschauen.
    P.S.: Der file_value Wert wird so zusammengebastelt da ich das später in eine mssql DB schiebe. Den ganzen SQL Kram etc habe ich aber nun entfernt, das klappt ja auch.

    Gruß Dietmar

  • Ich hab mir das ehrlicherweise nicht angesehen.
    Nur eine Alternativlösung:

    Spoiler anzeigen
    [autoit]

    #include <Constants.au3>
    #include "Array.au3"

    [/autoit] [autoit][/autoit] [autoit]

    Global $sFileName = "test.ini"
    Global $FileHandle = FileOpen($sFileName)
    Global $aSectionNames = IniReadSectionNames($sFileName)

    [/autoit] [autoit][/autoit] [autoit]

    If @error Then
    MsgBox(4096, "", "Es ist ein Fehler aufgetreten. Wahrscheinlich keine INI Datei vorhanden.")
    Else
    For $i = 1 To $aSectionNames[0]
    $aRet = IniReadSectionEx($FileHandle, $aSectionNames[$i])
    If Not @error Then _ArrayDisplay($aRet, $aSectionNames[$i])
    Next
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    FileClose($FileHandle)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; #FUNCTION# ======================================================================================
    ; Name ..........: IniReadSectionEx()
    ; Description ...: Reads all key/value pairs from a section in a standard format .ini file
    ; Syntax ........: IniReadSectionEx($hFile, $sSectionName)
    ; Parameters ....: $hFile - Filename as a String or a opened Filehandle
    ; $sSectionName - Sectionname as a String
    ; Return values .: Success: Return 2Dim-Array with [$i][0]=Key, [$i][1]=Value
    ; Failure: Return "" and set @error
    ; Author ........: AspirinJunkie
    ; Related .......: Constants.au3
    ; =================================================================================================
    Func IniReadSectionEx($hFile, $sSectionName)
    ;by AspirinJunkie
    Local $aReplaces[1][2] = [["\", "\\"]]
    Local $sLine, $aSSplit, $bFHandle = True
    Local $oCurrentDict = ObjCreate('Scripting.Dictionary')
    If @error Then Return SetError(1, @error, "")

    [/autoit] [autoit][/autoit] [autoit]

    If VarGetType($hFile) = "String" Then
    $bFHandle = False
    $hFile = FileOpen($hFile)
    Else
    FileGetPos($hFile)
    If @error Then Return SetError(2, 0, "")
    FileSetPos($hFile, 0, $FILE_BEGIN)
    EndIf
    If $hFile = -1 Then Return SetError(3, 0, "")

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To UBound($aReplaces) - 1 ; passt an regulären Ausdruck an:
    $sSectionName = StringReplace($sSectionName, $aReplaces[$i][0], $aReplaces[$i][1])
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Do
    $sLine = FileReadLine($hFile)
    If @error Then ExitLoop

    [/autoit] [autoit][/autoit] [autoit]

    If StringRegExp($sLine, "^\s*\[" & $sSectionName & "\]\s*$") Then
    Do
    $sLine = FileReadLine($hFile)
    If @error Then ExitLoop
    If StringRegExp($sLine, "^\s*\[.+\]\s*$") Then ExitLoop 2

    [/autoit] [autoit][/autoit] [autoit]

    $aSSplit = StringSplit($sLine, "=", 2)
    If UBound($aSSplit) = 2 Then
    If Not $oCurrentDict.Exists($aSSplit[0]) Then $oCurrentDict.Add($aSSplit[0], $aSSplit[1])
    EndIf
    Until 0
    EndIf
    Until 0

    [/autoit] [autoit][/autoit] [autoit]

    If $bFHandle = False Then FileClose($hFile)

    [/autoit] [autoit][/autoit] [autoit]

    If $oCurrentDict.Count > 0 Then
    Local $aRet[$oCurrentDict.Count][2], $i = 0
    For $sKey In $oCurrentDict.Keys
    $aRet[$i][0] = $sKey
    $aRet[$i][1] = $oCurrentDict($sKey)
    $i += 1
    Next
    Return $aRet
    Else
    Return SetError(4, 0, "")
    EndIf
    EndFunc ;==>IniReadSectionEx

    [/autoit]

    Edit: Ich denke dein Problem mit dem anderen Skript ist einfach nur dass du Schrägstriche im Sektionsnamen hast und diese in einem regulären Ausdruck Sonderzeichen einleiten.
    Um sie korrekt zu verwenden muss diese Funktion durch 2 Schrägstriche wieder aufgehoben werden. Daher müsste man vorher also noch in deinen Sektionsnamen die "\" durch "\\" austauschen.

    2 Mal editiert, zuletzt von AspirinJunkie (27. Februar 2011 um 16:14)

  • Jo danke gleich mal testen mit der großen Ini Datei.
    Das Bekloppte ist ja das es 5 Sectionames gibt die sich am Ende im Namen nur geringfügig unterscheiden.
    Und es dann beim 1. & 3. & 4. & 5. klappt, der 2. aber übergangen wird.

    Zitat


    [\Programm\Bin\7.3\DE-DE\] <-- OK
    [\Programm\Bin\7.3\EN-US\] <-- Nicht OK
    [\Programm\Bin\7.3\FR-FR\] <-- OK
    [\Programm\Bin\7.3\NL-NL\] <-- OK
    [\Programm\Bin\7.3\PL\] <-- OK

    Gruß Dietmar

    Achtung Anfänger! :whistling:

    Betrachten des Quellcodes auf eigene Gefahr, bei Übelkeit,Erbrechen,Kopfschmerzen übernehme ich keine Haftung. 8o

  • Edit: Ich denke dein Problem mit dem anderen Skript ist einfach nur dass du Schrägstriche im Sektionsnamen hast und diese in einem regulären Ausdruck Sonderzeichen einleiten.


    Nein, nicht ganz aber fast!

    Die Sektionsnamen werden im Pattern mit \Q ... \E maskiert. Der Sektionsname darf also jedes Zeichen enthalten - nur kein \E. Die Lösung ist denkbar einfach:

    Vor dem StringRegExp in der Funktion _IniReadSectionMax einfach das hier einfügen:

    [autoit]


    $sSection = StringReplace($sSection,"\E","\E\\E\Q")

    [/autoit]
    Spoiler anzeigen
    [autoit]

    Func _IniReadSectionMax($sPath,$sSection) ; Thx to SEuBo
    Local $sText, $aSection, $aRet
    $sText = FileRead($sPath)
    $sSection = StringReplace($sSection,"\E","\E\\E\Q")
    $aSection = StringRegExp($sText,'(?is)\Q['&$sSection&']\E(.+?)(?:\[|$)',1)
    If Not @error Then Return _RegExp($aSection[0], '(.*?)\h*=\h*([^\v]*)')
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _RegExp($sTest, $sPattern, $iOffset = 0) ; Thx to SEuBo
    ; Easy RegExp with >1 Subpattern (SEuBo)
    Local $aRet, $iUB, $iUB2, $aDummy, $aNewArr
    $aRet = StringRegExp($sTest, $sPattern, 4, $iOffset)
    If @error Then Return ConsoleWrite(@extended & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    Local $iUB = UBound($aRet), $iUB2 = UBound($aRet[0]), $aNewArr[$iUB][$iUB2 - 1]
    For $i = 0 To $iUB - 1
    Local $aDummy = $aRet[$i], $iUBD = UBound($aDummy)

    [/autoit] [autoit][/autoit] [autoit]

    If $iUBD - 1 > $iUB2 Then
    $iUB2 = $iUBD
    ReDim $aNewArr[$iUB][$iUB2]
    EndIf
    For $j = 1 To $iUBD - 1
    $aNewArr[$i][$j - 1] = $aDummy[$j]
    Next
    Next
    Return $aNewArr
    EndFunc ;==>_RegExp

    [/autoit] [autoit][/autoit] [autoit][/autoit]

    MfG

  • So nachdem ich einen Denkfehler meinerseits behoben habe...
    bei der Maximaldatei sind es 36 und nicht 22 Sectionsnamen :) passt nun auch die Rechnung.

    Beide Lösungsvorschläge sind funktionell :thumbup: und sicher beiseite gelegt.
    Im aktuellen Fall habe ich mich für die schon benutze Funktion von SEuBo entschieden.

    Beide machen ihren Job gut und besser alls das was ich mir hätte zudsammenpuzzeln müssen.
    Aber SEuBo sein Script ist ist etwas schneller und benötigt etwas weniger Umstellung im Hauptprogramm.
    Oder anders es bleibt so für mich etwas lesbarer.
    Eine Macke hatte die Fehlerbehandlung von Aspirins Lösung noch:

    [autoit]

    ;~ FileSetPos($hFile, 0, $FILE_BEGIN)

    [/autoit]

    existiert nicht und wird infolgedessen vor Initialisierung angesprochen.

    Laufzeit beim Lesen einer IniDatei mit 2618 Einträgen und 36 Sektionen und Import in die Tabelle einer MSSQL-DB():
    InreadSectionsName von SEuBo:
    >Exit code: 0 Time: 3.731

    InreadSectionsName von Aspirin:
    >Exit code: 0 Time: 4.326

    Besten Dank Euch beiden. :party:

    Gruß Dietmar

    Achtung Anfänger! :whistling:

    Betrachten des Quellcodes auf eigene Gefahr, bei Übelkeit,Erbrechen,Kopfschmerzen übernehme ich keine Haftung. 8o

  • Eine Macke hatte die Fehlerbehandlung von Aspirins Lösung noch:

    AutoIt-Quellcode
    1
    ;~ FileSetPos($hFile, 0, $FILE_BEGIN)
    existiert nicht und wird infolgedessen vor Initialisierung angesprochen.

    Wie bitte - hab ich jetzt nicht verstanden.
    Die Zeile wird nur ausgeführt wenn festgestellt wurde das $hFile ein geöffnetes FileHandle und eben kein FileName darstellt.

    Laufzeit beim Lesen einer IniDatei mit 2618 Einträgen und 36 Sektionen und Import in die Tabelle einer MSSQL-DB():


    Poste die Datei doch mal.
    Optimiert ist hier noch lange nichts.

  • Zitat

    Die Zeile wird nur ausgeführt wenn festgestellt wurde das $hFile ein geöffnetes FileHandle und eben kein FileName darstellt.


    Das stimmt natürlich aber es wird vorher geprüft und wenn die Variable nicht bekannt ist gibt es den üblichen Fehler benutzt bevor definiert.

    Was nun aber seltsam ist dein Script im Gesammten funktioniert, bei mir eingebaut musste ich für nen Test die Zeile auskommentieren :)
    Muss ich wohl noch was falsch gemacht haben ?(

    Zitat

    Poste die Datei doch mal.
    Optimiert ist hier noch lange nichts.

    Ungern da es Firmenmaterial ist, also Liste aller Dateien mit Version Produkt-Version Datum erstellt,geändert Größe usw.
    Das wäre relativ aufwendig die zu entschärfen ;) schneller geht vermutlich eine neue erstellen.

    Du hast mir ja auch schon geholfen von daher ist doch alles gut, aber ich kann mal eben ne Liste vom System32 oder so erstellen.
    Falls dich die Langeweile packt und es Dir keine Ruhe gibt.
    Das sollte in keine Fall Kritik sein das Dein Lösungsorschlag etwas langsamer ist, also bitte nicht falsch verstehn.
    Aber bei dem einem habe ich so grob verstanden was da passiert so muss ich nicht umdenken.
    Da ich mich dann nicht entscheiden konnte, habe ich einfach geschaut wer schneller ist. :)

    So gibt gleich ne Datei mit ~3000 Dateien :)

    Die hier benötigt ~6sec (>Exit code: 0 Time: 5.978 mit SEuBos Methode) bei 3055 Datensätzen


    Gruß Dietmar

  • Das stimmt natürlich aber es wird vorher geprüft und wenn die Variable nicht bekannt ist gibt es den üblichen Fehler benutzt bevor definiert.
    Was nun aber seltsam ist dein Script im Gesammten funktioniert, bei mir eingebaut musste ich für nen Test die Zeile auskommentieren
    Muss ich wohl noch was falsch gemacht haben

    Also meinst du gar nicht die $hFile, denn die ist ja immer deklariert (ist ja der Funktionsparameter), sondern die Konstante $FILE_BEGIN.
    Und extra wegen dieser Konstante hab ich im Funktionsheader den Eintrag "Related" hinterlassen...