Fehler: ungültiger Dateimodus bei Dateikonvertierung

  • VBScript

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Sachsenbauch.

    Fehler: ungültiger Dateimodus bei Dateikonvertierung

    Hallo,

    ich benötige wieder mal Euer spezielles Insider-Know How. Mir bringt ein zusammengebasteltes Script immer wieder Fehlermeldungen.
    Und zwar möchte ich ordnerweise aus Textdateien die Textzeilen extrahieren, die mit einem Vergleichstext übereinstimmen. Diese Zeilen soll dann in Datei geschrieben werden, deren Endung sich in .txt ändern soll. Mit dem zweiten Teil des Scripts bin ich ganz gut gefahren, musste jedoch immer den Namen der Quelldatei eingeben, das ist bei ca. 15 Dateien pro Ordner und 25 Ordnern (x 10 Jahrgängen) doch ziemlich aufwendig. Also habe ich diesen Teil an ein vorhandenes Script angefügt und angepasst. Aber ich bekomme bei Zeile 39 den Fehler: ungültiger Dateimodus. Was mache ich falsch ?

    Ein zweites Problem besteht innerhalb des Tags Problemzone darin, dass ich gern die nachfolgende Zeile(n) ausgelesen haben möchte, wie baut man einen Zeilenzähler ein..
    Über eine konkrete Antwort würde ich mich als VBS-Neuling sehr freuen.

    Vielen Danke !
    Micha

    Visual Basic-Quellcode

    1. Dim objFso, strFolder
    2. ' Beginn des Hauptprogamms
    3. Set objFso = CreateObject("Scripting.FileSystemObject")
    4. strFolder = objFso.GetParentFolderName(WScript.ScriptFullName)
    5. If objFso.FolderExists(strFolder) Then
    6. Call GetDOKFiles(objFso.GetFolder(strFolder))
    7. End If
    8. Set objFso = Nothing
    9. ' End des Hauoptprogramms
    10. Sub GetDOKFiles(ByRef objFolder)
    11. Dim objFile, objSubFolder
    12. For Each objFile In objFolder.Files
    13. If LCase(objFso.GetExtensionName(objFile.Name)) = "dok" Then
    14. Call DOKinTXT(objFile.Path, objFolder.Path)
    15. End If
    16. Next
    17. For Each objSubFolder In objFolder.SubFolders
    18. Call GetDOKFiles(objSubFolder)
    19. Next
    20. End Sub
    21. Sub DOKinTXT(ByRef strPath, ByRef strFolder)
    22. Dim arrText, strText, strTextLine, strTXTPath, objDOKFile, objTXTFile
    23. strTXTPath = objFso.BuildPath(strFolder, objFso.GetBaseName(strPath) & ".txt")
    24. Set objDOKFile = objFso.OpenTextFile(strPath)
    25. Set objTXTFile = objFso.CreateTextFile(strTXTPath) ' objTXTFile
    26. Do Until objTXTFile.AtEndOfStream ' => FEHLER: ungültiger Dateimodus
    27. ' Zeile für Zeile aus der Quelldatei lesen
    28. strLine = objTXTFile.ReadLine
    29. ' Das exakte Suchwort in der Zeile finden
    30. If Instr(1, strLine, "Gemeindestatistik 20", 1) > 0 Then
    31. ' Die gesamte Zeile in die Ausgabedatei schreiben
    32. objTXTFile.WriteLine strLine
    33. End If
    34. If Instr(1, strLine, "(Amtlicher", 1) > 0 Then
    35. objTXTFile.WriteLine strLine
    36. End If
    37. If Instr(1, strLine, "rungsfortschreibung auf Basis", 1) > 0 Then
    38. objTXTFile.WriteLine strLine
    39. End If
    40. If Instr(8, strLine, "Gebiet und Bevölkerung", 1) > 0 Then
    41. objTXTFile.WriteLine vbcrlf & "GEBIET UND BEVÖLKERUNG" & vbcrlf & "¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯" & vbcrlf
    42. End If
    43. If Instr(1, strLine, "in qkm", 1) > 0 Then
    44. objTXTFile.WriteLine strLine
    45. End If
    46. If Instr(1, strLine, "am 03.10.1990 insgesamt", 1) > 0 Then
    47. objTXTFile.WriteLine strLine
    48. End If
    49. If Instr(1, strLine, "davon männlich", 1) > 0 Then
    50. objTXTFile.WriteLine strLine
    51. End If
    52. If Instr(1, strLine, "davon weiblich", 1) > 0 Then
    53. objTXTFile.WriteLine strLine
    54. End If
    55. If Instr(1, strLine, "je qkm am 31.12.", 1) > 0 Then
    56. objTXTFile.WriteLine strLine
    57. End If
    58. If Instr(1, strLine, "nder am 31.12.2", 1) > 0 Then
    59. objTXTFile.WriteLine strLine
    60. End If
    61. If Instr(1, strLine, "Bevölkerung am 31.12.2", 1) > 0 Then
    62. objTXTFile.WriteLine strLine
    63. End If
    64. If Instr(1, strLine, "unter 3 Jahre", 1) > 0 Then
    65. objTXTFile.WriteLine strLine
    66. End If
    67. If Instr(1, strLine, "bis unter", 1) AND NOT Instr(1, strLine, "von 10 bis unter", 1)> 0 Then
    68. objTXTFile.WriteLine strLine
    69. End If
    70. If Instr(1, strLine, "Jahre und mehr", 1) > 0 Then
    71. objTXTFile.WriteLine strLine
    72. End If
    73. If Instr(1, strLine, " Bevölkerungsbewegung", 1) > 2 Then
    74. objTXTFile.WriteLine vbcrlf & "BEVÖLKERUNGSBEWEGUNG" & vbcrlf & "¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯"
    75. End If
    76. If Instr(1, strLine, "Lebendgeborene ", 1) > 0 Then
    77. objTXTFile.WriteLine strLine
    78. End If
    79. If Instr(1, strLine, " Gestorbene", 1) > 0 Then
    80. objTXTFile.WriteLine strLine
    81. End If
    82. ' --------- Beginn Problemzone
    83. If Instr(1, strLine, "berschuss Lebendgeborene bzw", 1) > 0 Then
    84. ' die nächste Zeile muss geschrieben werden !!!
    85. objTXTFile.WriteLine strLine
    86. End If
    87. If Instr(1, strLine, "ber die Gebietsgrenze", 1) > 0 Then
    88. ' zwei Zeilen, nur die erste wird geschrieben !
    89. objTXTFile.WriteLine strLine
    90. End If
    91. '------------ Ende Problemzone
    92. If Instr(1, strLine, "berschuss Zu- bzw. Fort", 1) > 0 Then
    93. objTXTFile.WriteLine strLine
    94. End If
    95. If Instr(1, strLine, "nderung 2", 1) > 0 Then
    96. objTXTFile.WriteLine strLine
    97. End If
    98. Loop
    99. objDOKFile.Close
    100. objTXTFile.Close
    101. End Sub

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Sachsenbauch“ ()

    petaod schrieb:

    AtEndOfStream ist für lesenden Zugriff gedacht.
    Kann es sein, dass du von objDOKFile lesen und in objTXTFile schreiben willst?
    Dann solltest du die jeweils richtigen File-Objekte verwenden.


    Na klar, Mann bin ich ein :cursing: . Danke, das Script läuft gut.
    Könntest Du mir vielleicht auch bei meinen zweiten Problem (Problemzone Zeilen 115 bis 123) irgendwie behilflich sein ?
    Wenn du zwei Zeilen schreiben willst, musst du an der Stelle nochmals eine ReadLine/WriteLine eintragen.
    Oder du setzt dir ein Flag, dass die nächste Zeile auf jeden Fall geschrieben wird.

    Im Übrigen solltest du dich dringend mit dem ElseIf-Statement beschäftigen.

    Visual Basic-Quellcode

    1. Do Until objDOCFile.AtEndOfStream
    2. strLine = objDOCFile.ReadLine
    3. If Instr(1, strLine, "Gemeindestatistik 20", 1) > 0 Then
    4. objTXTFile.WriteLine strLine
    5. ElseIf Instr(1, strLine, "(Amtlicher", 1) > 0 Then
    6. objTXTFile.WriteLine strLine
    7. ElseIf Instr(1, strLine, "rungsfortschreibung auf Basis", 1) > 0 Then
    8. ...
    9. End If
    10. Loop
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ich komme einfach nicht, weiter...
    habe versucht, über eine For-Schleife die Zeile 151 auszulesen und zu schreiben

    Visual Basic-Quellcode

    1. ...
    2. ' Zeile 151 auslesen
    3. For i = 1 to 150
    4. objDOKFile.ReadLine
    5. Next
    6. strLine2 = objDOKFile.ReadLine
    7. objTXTFile.WriteLine strLine2
    8. ...


    Unter Beibehaltung der If .. EndIf Abfrage erhalte ich den Fehler "Eingabe hinter Dateiende" (800A003E)
    und nach Umwandlung in das ElseIf-Statement geschieht gar nix...
    Es müsste also ein Flag gesetzt werden, aber wie ?

    Visual Basic-Quellcode

    1. MustWriteNextLine = False
    2. Do Until objDOCFile.AtEndOfStream
    3. strLine = objDOCFile.ReadLine
    4. If MustWriteNextLine Then
    5. objTXTFile.WriteLine strLine
    6. MustWriteNextLine=False
    7. ElseIf Instr(1, strLine, "Gemeindestatistik 20", 1) > 0 Then
    8. objTXTFile.WriteLine strLine
    9. ElseIf Instr(1, strLine, "(Amtlicher", 1) > 0 Then
    10. objTXTFile.WriteLine strLine
    11. ElseIf Instr(1, strLine, "rungsfortschreibung auf Basis", 1) > 0 Then
    12. ...
    13. ElseIf Instr(1, strLine, "berschuss Lebendgeborene bzw", 1) > 0 Then
    14. MustWriteNextLine = True 'schreibe nur nächste
    15. ElseIf Instr(1, strLine, "ber die Gebietsgrenze", 1) > 0 Then
    16. objTXTFile.WriteLine strLine 'schreibe diese
    17. MustWriteNextLine = True 'schreibe nächste
    18. ElseIf ...
    19. ...
    20. End If
    21. Loop
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hallo petaod, :thumbsup:
    für dieses wunderbare Script danke ich Dir herzlich. Dein Kurzscript lief zur vollsten Zufriedenheit. Bei meinem (längeren) gab es Probleme mit Wörtern, die im Quelltext mehrfach vorkommen (s. Originalcode Zeile 105 bis 111). Ich habe dies mit den Logikoperatoren AND NOT lösen können. Glücklicherweise standen die beiden Wörter nur einmal am Zeilenanfang. Besser wäre wohl eine Function, welche die Anzahl des Vorkommens eines Strings ausliest.
    Hier also die Codeschnipsel:

    Visual Basic-Quellcode

    1. ElseIf Instr(1, strLine, "Lebendgeborene ", 1) AND NOT Instr(3, strLine, "Lebendgeborene", 1) > 0 Then
    2. objTXTFile.WriteLine strLine
    3. ...
    4. ElseIf Instr(1, strLine, "Gestorbene ", 1) AND NOT Instr(3, strLine, "Gestorbene", 1) > 0 Then
    5. objTXTFile.WriteLine strLine

    Im Grunde reicht mir dieses Script für diesen speziellen Statistik-Zweck. Damnke für Deine Mühe und einen sonnigen Tag
    Micha:el :thumbup: