FileReadLine gibt 1 zurück (Sets @error to 1 if file not opened in read mode or other error WTF???)

  • Moin

    Also folgendes Problem...wenn ich in meinem Progi die Datei "new.csv" lesen will, gibt die MsgBox die ich hinten ran gemacht habe den Fehler 1 aus.
    dieser lautet: Sets @error to 1 if file not opened in read mode or other error.

    Was mache ich falsch? Mir geht es im moment auch nur um diesen Teil und ja ich weiss das es irgendwie auch einfacher gehen würde :rolleyes: .

    Das Problem ist in Zeile 63 aufgetreten

    Spoiler anzeigen
    [autoit]

    #include <array.au3>
    #include <file.au3>

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

    $pwdline = 2
    $sourceline = 1
    $ausgabepath = "KWI_AD_LEHRER.CSV"
    $sourcepath = "KWI_AD_LEHRER(source).CSV"
    $newsourcepath = "new.csv"
    $pwdlistpath = "Neuer Ordner/ADConnector_PASSWORDS_23062011_142408l.csv"
    If FileExists($newsourcepath) Then
    FileDelete($newsourcepath)
    EndIf
    ;~ $pwdlist = FileOpen("Neuer Ordner/ADConnector_PASSWORDS_23062011_142408l.csv", 0)

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

    ;~ $newsource = FileOpen("new.csv", 0)

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

    Unix2Dos($sourcepath, $newsourcepath)

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

    While True
    $newsource = FileOpen("new.csv", 0)
    $SourceString = FileReadLine($newsource, $sourceline)
    If @error Then ;Bei Fehler
    If @error = -1 Then ;Wenn die zu lesende Zeile nicht mehr existiert
    ExitLoop ;Aus Schlaufe springen
    Else
    Exit
    EndIf
    EndIf
    FileClose($newsource)
    $SourceArray = StringSplit($SourceString, ";") ;String in Array schreiben
    $listline = 1
    $linien = _FileCountLines($newsourcepath)
    While Not $listline = $linien ;Schlaufe bis das ganze File durchsucht wurde
    $pwdlist = FileOpen("Neuer Ordner/ADConnector_PASSWORDS_23062011_142408l.csv", 0)
    $ListString = FileReadLine($pwdlist, $listline) ;Zeile einlesen
    If @error Then ;Bei Fehler
    If @error = -1 Then ;Wenn die zu lesende Zeile nicht mehr existiert
    ExitLoop ;Aus Schlaufe springen
    Else
    Exit
    EndIf
    EndIf
    FileClose($pwdlist)
    $ListArray = StringSplit($ListString, ";") ;String in Array schreiben
    $suche = $ListArray[2] ;Wert nach dem gefiltert werden sollte
    $finde = $SourceArray[3] ;Wenn der Wert existiert, steht er in der 3. Spalte
    $left = 4
    If $listline = 1 And $left > 0 Then ;Entfernt die Nullen die bei der einen Datei bei der PersNr ausgelesen wurden
    $string = StringLeft($finde, 1) = "0" ;Liest das erste Zeichen aus und prüft ob es eine 0 ist
    While $string = "True" ;Solange der Vergleich positiv ist
    $finde = StringReplace($finde, "0", "", 1) ;entfernt eine 0
    $string = StringLeft($finde, 1) = "0" ;führt den Vergleich erneut aus
    WEnd
    EndIf
    If $suche = $finde Then ;Wenn die beiden Werte nun gleich sind
    $listline = $listline + 1
    ExitLoop ;Aus While-Schlaufe springen
    EndIf
    $listline = $listline + 1
    WEnd
    $linie = $listline - 1
    $newsource = FileOpen("new.csv", 0)
    $writestring = FileReadLine($newsource, $linie) ;Ab hier gehts nicht mehr weiter <== File not opened in read mode OR OTHER ERROR????? <==
    If @error Then ;Bei Fehler
    MsgBox(0, "", @error, 1) ;Zeigt den Fehlercode an
    If @error = -1 Then ;Wenn die zu lesende Zeile nicht mehr existiert
    ExitLoop ;Aus Schlaufe springen
    Else
    Exit
    EndIf
    EndIf
    FileClose($newsource)
    $writearray = StringSplit($writestring, ";")
    If $linie - 1 = $linien Then
    _ArrayAdd($writearray, "Passwort nicht gefunden!") ;Neuen Arraywert in die letzte Spalte des Arrays setzen
    Else
    $pwdlist = FileOpen("Neuer Ordner/ADConnector_PASSWORDS_23062011_142408l.csv", 0)
    $pwstring = FileReadLine($pwdlist, $linie)
    FileClose($pwdlist)
    $pwarray = StringSplit($ListString, ";")
    $passwort = $pwarray[8]
    _ArrayAdd($writearray, $passwort)
    EndIf
    _ArrayDelete($writearray, 0) ;Entfernt die Arrayinformationen die in Spalte 0 stehen
    $write = _ArrayToString($writearray, ";") ;Konvertiert das Array zurück in einen mit ; getrennten String
    $ausgabe = FileOpen("KWI_AD_LEHRER.CSV", 2)
    FileWriteLine($ausgabe, $write) ;Schreibt diesen String in die Ausgabedatei (diese sollte nun alle Informationen aus dem Sourcefile wie namen etc. enthalten und zusätzlich sollte noch das jeweilige Passwort in der letzten Spalte stehen
    FileClose($ausgabe)
    WEnd

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

    Func Unix2Dos(ByRef $in, ByRef $outpath) ;Neue Funktion einleiten
    #include <file.au3>
    $line = 1
    $lines = _FileCountLines($in)
    While True ;Endlosschlaufe
    $output = FileOpen($outpath, 1)
    $instring = FileReadLine($in, $line) ;Zeile in String lesen
    If @error Then ;Bei Fehler Wiederholung beenden
    ExitLoop
    EndIf
    $instring = StringReplace($instring, Chr(32), "") ;Leerschläge entfernen
    FileWriteLine($output, $instring) ;Konvertierten Text in Datei schreiben
    $lines = $lines - 1
    $line = $line + 1
    FileClose($output) ;File muss geschlossen werden, da das Unterprogramm anstonsten nicht volständigt ausgeführt wird
    WEnd
    EndFunc ;==>Unix2Dos

    [/autoit]

    Bild1: Ich beim debuggen

    2 Mal editiert, zuletzt von General Kaboom (13. Juli 2011 um 14:54)

  • Zeile 20: $newsource = FileOpen("new.csv", 0)

    Du öffnest die Datei new.csv, aber wo liegt die Datei? Gib mal Pfade mit an, also z.B @ScriptDir oder C:\

  • nee...sieh es dir mal an

    [autoit]

    Func Unix2Dos(ByRef $in, ByRef $outpath) ;Neue Funktion einleiten
    #include <file.au3>
    $line = 1
    $lines = _FileCountLines($in)
    While True ;Endlosschlaufe
    $output = FileOpen($outpath, 1)
    $instring = FileReadLine($in, $line) ;Zeile in String lesen
    If @error Then ;Bei Fehler Wiederholung beenden
    ExitLoop
    EndIf
    $instring = StringReplace($instring, Chr(32), "") ;Leerschläge entfernen
    FileWriteLine($output, $instring) ;Konvertierten Text in Datei schreiben
    $lines = $lines - 1
    $line = $line + 1
    FileClose($output) ;File muss geschlossen werden, da das Unterprogramm anstonsten nicht volständigt ausgeführt wird
    WEnd
    EndFunc ;==>Unix2Dos

    [/autoit]

    Es schliesst das File sogar in den Zwischenschritten (aus irgendeinem Grund funktioniert das ganze sonst nicht, aber ich weiss auch nicht wieso ^^ )
    Unix2Dos ist übrigends nur eine Funktion, weil das File sonst erst fertig geschrieben wird wenn das Program beendet ist, es hält einfach bei 12kb (von den schlussendlichen 13kb) an und schreibt nach dem beenden noch ca 2-5 Zeilen, auch hier weiss ich nicht wieso aber es funktioniert ja auch anders

    Bild1: Ich beim debuggen

  • Debugge mal mit

    [autoit]

    $newsource = FileOpen("new.csv", 0)
    $debug = FileRead($newsource)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $debug = ' & $debug & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

    [/autoit]
  • dann schau dir mal den Wert $linie an,
    ich glaube der ist zu groß.
    Wenn ich das richtig lese, willst du ja die letzte Zeile auslesen, da wo der Fehler passiert.
    Die letzte Zeile wird aber mit dem parameter -1 aufgerufen

    -EDIT-
    Entferne die CSV Datei auch wieder aus deinem Post, ich sehe da personenbezogene Daten, die sollten nicht unbedingt öffentlich sein ;)

    -EDIT2-
    setz auch bitte

    [autoit]

    $listline = $listline + 1

    [/autoit]

    an den Anfang der Schleife und gib der Variablen den Wert 0, sonst überspringt der die letzte Zeile

  • danke werd ich mal versuchen...die .csv-daten sind zwar nicht geheim (alle namen wurden ausgetauscht) aber damit hier kein falscher Eindruck von mir entsteht :D...das mit listline hab ich auch schonmal so drinn gehabt, war mir nur nicht sicher ob das so geht xD

    Bild1: Ich beim debuggen

  • Hmmm....nein die Zahl stimmt...ich glaube das da irgendetwas beim öffnen des Files schiefgelaufen ist....der FileClose ist ja in Unix2Dos in einer Endlosschleife und ich glaube, dass diese nach der Funktion das File Unaufhaltsam immer wieder schliesst und somit das öffnen Sinnlos macht...kann das sein???

    Bild1: Ich beim debuggen

  • Setz mal in deine Funktion bei Zeile 107

    [autoit]

    If @error Then
    FileClose($output)
    Exitloop
    EndIf

    [/autoit]
  • Die ganze Funktion Unix2Dos ist ein großer Humbug:

    • ByRef für eine kleine Pfadangabe? Das führt dazu das nur Variablen eingetragen werden können und nicht direkt ein Pfad.
    • Ein #include in einer Funktion. Alles was in der includeten Datei steht wird 1:1 an dieser Stelle in den Quellcode gefügt. Heißt man hat dann Funktionsdeklarationen in einer Funktion - das rafft AutoIt dahin. Hier wird es nur dadurch verhindert weil die File.au3 schon vorher eingebunden wird und in der Datei ein #include-once steht.
    • Wenn man mit FileReadLine eine ganze Datei durchgeht dann sollte man nicht die Zeile manuell angeben. - steht sogar in der Hilfe dazu.

    Wenn ich das richtig interpretiere und die einzige Aufgabe der Funktion Unix2Dos ist die Leerzeichen aus einer Datei zu entfernen und das Ergebnis in eine neue Datei zu schreiben dann würde ich es eher so lösen (ungetestet):

    [autoit]

    Func Unix2Dos(Const $in, Const $outpath)
    Local $h_File = FileOpen($outpath, 2)
    FileWrite($h_File, StringReplace(FileRead($in), Chr(32), ''))
    FileClose($h_File)
    EndFunc

    [/autoit]
  • Naja...deine Funktion macht schonmal das richtige...aber leider ist da immernoch irgendwo ein fehler in meinem programm, denn die Eingabefiles haben ca. 100 linien (das file das aus der Funktion kommt auch) aber das Ausgabefile enthält nur noch die erste linie...wenigstens ist das ReadLine-Problem verschwunden...schonmal danke LuBu, dir auch Junkie

    Bild1: Ich beim debuggen

  • Also...hier mal der aktuelle Code:

    Spoiler anzeigen
    [autoit]

    #include <array.au3>
    #include <file.au3>

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

    $pwdline = 2
    $sourceline = 1
    $ausgabepath = "KWI_AD_LEHRER.CSV"
    $sourcepath = "KWI_AD_LEHRER(source).CSV"
    $newsourcepath = "new.csv"
    $pwdlistpath = "Neuer Ordner/ADConnector_PASSWORDS_23062011_142408l.csv"
    If FileExists($newsourcepath) Then
    FileDelete($newsourcepath)
    EndIf

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

    Unix2Dos($sourcepath, $newsourcepath)

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

    While True
    $newsource = FileOpen("new.csv", 0)
    $SourceString = FileReadLine($newsource, $sourceline)
    If @error Then ;Bei Fehler
    If @error = -1 Then ;Wenn die zu lesende Zeile nicht mehr existiert
    ExitLoop ;Aus Schlaufe springen
    Else
    Exit
    EndIf
    EndIf
    FileClose($newsource)
    $SourceArray = StringSplit($SourceString, ";") ;String in Array schreiben
    $listline = 0
    $linien = _FileCountLines($newsourcepath)
    While Not $listline = $linien ;Schlaufe bis das ganze File durchsucht wurde
    $listline = $listline + 1
    $pwdlist = FileOpen("Neuer Ordner/ADConnector_PASSWORDS_23062011_142408l.csv", 0)
    $ListString = FileReadLine($pwdlist, $listline) ;Zeile einlesen
    If @error Then ;Bei Fehler
    If @error = -1 Then ;Wenn die zu lesende Zeile nicht mehr existiert
    ExitLoop ;Aus Schlaufe springen
    Else
    Exit
    EndIf
    EndIf
    FileClose($pwdlist)
    $ListArray = StringSplit($ListString, ";") ;String in Array schreiben
    $suche = $ListArray[2] ;Wert nach dem gefiltert werden sollte
    $finde = $SourceArray[3] ;Wenn der Wert existiert, steht er in der 3. Spalte
    $left = 4
    If $listline = 1 And $left > 0 Then ;Entfernt die Nullen die bei der einen Datei bei der PersNr ausgelesen wurden
    $left = $left - 1
    $string = StringLeft($finde, 1) = "0" ;Liest das erste Zeichen aus und prüft ob es eine 0 ist
    While $string = "True" ;Solange der Vergleich positiv ist
    $finde = StringReplace($finde, "0", "", 1) ;entfernt eine 0
    $string = StringLeft($finde, 1) = "0" ;führt den Vergleich erneut aus
    WEnd
    EndIf
    If $suche = $finde Then ;Wenn die beiden Werte nun gleich sind
    $listline = $listline + 1
    ExitLoop ;Aus While-Schlaufe springen
    EndIf
    WEnd
    $newsource = FileOpen("new.csv", 0)
    $writestring = FileReadLine($newsource, $listline)
    If @error Then ;Bei Fehler
    If @error = -1 Then ;Wenn die zu lesende Zeile nicht mehr existiert
    ExitLoop ;Aus Schlaufe springen
    Else
    Exit
    EndIf
    EndIf
    FileClose($newsource)
    $writearray = StringSplit($writestring, ";")
    If $listline - 1 = $linien Then
    _ArrayAdd($writearray, "Passwort nicht gefunden!") ;Neuen Arraywert in die letzte Spalte des Arrays setzen
    Else
    $pwdlist = FileOpen("Neuer Ordner/ADConnector_PASSWORDS_23062011_142408l.csv", 0)
    $pwstring = FileReadLine($pwdlist, $listline)
    FileClose($pwdlist)
    $pwarray = StringSplit($ListString, ";")
    $passwort = $pwarray[8]
    _ArrayAdd($writearray, $passwort)
    EndIf
    _ArrayDelete($writearray, 0) ;Entfernt die Arrayinformationen die in Spalte 0 stehen
    $write = _ArrayToString($writearray, ";") ;Konvertiert das Array zurück in einen mit ; getrennten String
    $ausgabe = FileOpen("KWI_AD_LEHRER.CSV", 2)
    FileWriteLine($ausgabe, $write) ;Schreibt diesen String in die Ausgabedatei (diese sollte nun alle Informationen aus dem Sourcefile wie namen etc. enthalten und zusätzlich sollte noch das jeweilige Passwort in der letzten Spalte stehen
    FileClose($ausgabe)
    WEnd

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

    Func Unix2Dos(Const $in, Const $outpath)
    $h_File = FileOpen($outpath, 2)
    FileWrite($h_File, StringReplace(FileRead($in), Chr(32), ''))
    FileClose($h_File)
    EndFunc

    [/autoit]

    Bild1: Ich beim debuggen

  • Spoiler anzeigen
    [autoit]

    $ausgabepath = "KWI_AD_LEHRER.CSV"
    $sourcepath = "KWI_AD_LEHRER(source).CSV"
    $newsourcepath = "new.csv"
    $pwdlistpath = "Neuer Ordner/ADConnector_PASSWORDS_23062011_142408l.csv"
    If FileExists($newsourcepath) Then
    FileDelete($newsourcepath)
    EndIf
    Unix2Dos($sourcepath, $newsourcepath)
    $Sourcelistarray = _CSV2Array($newsourcepath)
    $PWlistarray = _CSV2Array($pwdlistpath)
    For $i = 0 To UBound($Sourcelistarray) - 1
    If Stringleft($Sourcelistarray[$i][2], 1) = 0 Then $Sourcelistarray[$i][2] = StringTrimLeft($Sourcelistarray[$i][2], 1)
    If Stringleft($Sourcelistarray[$i][2], 1) = 0 Then $Sourcelistarray[$i][2] = StringTrimLeft($Sourcelistarray[$i][2], 1)
    If Stringleft($Sourcelistarray[$i][2], 1) = 0 Then $Sourcelistarray[$i][2] = StringTrimLeft($Sourcelistarray[$i][2], 1)
    If Stringleft($Sourcelistarray[$i][2], 1) = 0 Then $Sourcelistarray[$i][2] = StringTrimLeft($Sourcelistarray[$i][2], 1)
    If Stringleft($Sourcelistarray[$i][2], 1) = 0 Then $Sourcelistarray[$i][2] = StringTrimLeft($Sourcelistarray[$i][2], 1)
    If Stringleft($Sourcelistarray[$i][2], 1) = 0 Then $Sourcelistarray[$i][2] = StringTrimLeft($Sourcelistarray[$i][2], 1)
    Next
    For $i = 0 To UBound($Sourcelistarray) - 1
    For $k = 0 To UBound($PWlistarray) - 1
    If $Sourcelistarray[$i][2] = $PWlistarray[$k][1] Then $Sourcelistarray[$i][13] = $PWlistarray[$k][7]
    Next
    Next
    $hFile = FileOpen($ausgabepath, 2)
    For $i = 0 To UBound($Sourcelistarray) - 1
    $text = ""
    For $k = 0 To UBound($Sourcelistarray, 2) - 1
    $text &= $Sourcelistarray[$i][$k] & ";"
    Next
    $text = StringTrimRight($text, 1)
    FileWriteLine($hFile, $text)
    Next
    FileClose($hFile)

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

    Func Unix2Dos(Const $in, Const $outpath)
    $h_File = FileOpen($outpath, 2)
    FileWrite($h_File, StringReplace(FileRead($in), Chr(32), ''))
    FileClose($h_File)
    EndFunc
    Func _CSV2Array($hFile, $cSeperator = "auto", $bFilterString = True, $iColumnMode = 0)
    Local $s = FileRead($hFile)
    If @error Then Return SetError(1)
    If $cSeperator = Default Then $cSeperator = "auto"
    If Not $cSeperator Then $cSeperator = Opt("GUIDataSeparatorChar")
    ; searching the line-seperator and splitting the lines into an array
    Local $aLines
    If StringInStr($s, @CRLF) Then
    $aLines = StringSplit($s, @CRLF, 1)
    ElseIf StringInStr($s, @CR) Then
    $aLines = StringSplit($s, @CR)
    Else
    $aLines = StringSplit($s, @LF)
    EndIf
    ; searching the delimiter in the first line
    Local $aTMP
    If $cSeperator = "auto" Then
    Local $iMax = 0
    Local $iC[5] = [0, 0, 0, 0, 0]
    Local $sC[5] = [";", ",", @TAB, "|", " "]

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

    $aTMP = StringRegExp($aLines[1], ";", 3)
    If Not @error Then $iC[0] = UBound($aTMP)
    $aTMP = StringRegExp($aLines[1], ",", 3)
    If Not @error Then $iC[1] = UBound($aTMP)
    $aTMP = StringRegExp($aLines[1], "\t", 3)
    If Not @error Then $iC[2] = UBound($aTMP)
    $aTMP = StringRegExp($aLines[1], "\|", 3)
    If Not @error Then $iC[3] = UBound($aTMP)
    $aTMP = StringRegExp($aLines[1], "[ ]", 3)
    If Not @error Then $iC[4] = UBound($aTMP)

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

    For $i = 0 To UBound($sC) - 1
    If $iC[$i] > $iMax Then
    $iMax = $iC[$i]
    $cSeperator = $sC[$i]
    EndIf
    Next
    EndIf
    ; creating 2-dim array based on the number of data in the first line
    $aTMP = StringSplit($aLines[1], $cSeperator)
    Local $iCol = $aTMP[0]
    Local $aRet[$aLines[0]][$iCol]
    ; splitting and filling the lines
    For $i = 1 To $aLines[0]
    $aTMP = StringSplit($aLines[$i], $cSeperator)
    If @error Then ContinueLoop
    If $aTMP[0] > $iCol Then
    Switch $iColumnMode
    Case 0
    Return SetError(2, $i)
    Case 1
    ReDim $aRet[$aLines[0] - 1][$aTMP[0]]
    Case 2
    $aTMP[0] = $iCol
    Case Else
    Return SetError(3)
    EndSwitch
    EndIf
    For $j = 1 To $aTMP[0]
    $aTMP[$j] = StringStripWS($aTMP[$j], 7)
    If $bFilterString Then ; removing leading and trailing " or '
    $aTMP[$j] = StringRegExpReplace($aTMP[$j], '^("|'')(.*?)\1$', '$2')
    EndIf
    $aRet[$i - 1][$j - 1] = $aTMP[$j]
    Next ; /cols
    Next ; /lines
    Return $aRet
    EndFunc ;==>_CSV2Array

    [/autoit]


    Hier der neue, "bessere" Code ;)

    Die Funktion CSV2Array ist nicht von mir, hab aber leider nirgends das Copywright gefunden