Textdatei via VBSkript verändern

  • VBScript

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Textdatei via VBSkript verändern

    Hallo,ich bin auf der Such nach einer Lösung mit VBSkript (.vbs) zu folgendem Problem:
    ich möchte innerhalb einer test.txt-Datei nach einem Wort suchen und in der betroffen Zeile eine Zahl durch eine andere ersetzen.
    Hier ein Beispiel:

    20;"";"WE";"";"KST";"500004";"300811";"test"
    3A;"";"12103";"1";"30.08.2011";"08:08:09"
    20;"";"WE";"";"KST";"500004";"300811";"muster"
    3A;"";"12680";"1";"30.08.2011";"08:09:14"

    Hier soll z.B. in der Zeile mit "muster" die Zahl "500004" durch eine "500001" ersetzt werden.
    Dummerweise variiert die Zahl an der Stelle von "500000" bis "500009".

    Wer kann mir weiterhelfen?
    Vielen Dank schon mal,
    Edison

    * Topic verschoben *

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

    Ohne Gewähr, da ungetestet (evtl. Fehler kannst du sicher selbst beheben, wenn du das Prinzip verstanden hast):

    Visual Basic-Quellcode

    1. Set FSO=CreateObject ("Scripting.FileSystemObject")
    2. Set InFile=FSO.OpenTextFile ("test.txt",1) 'ForReading
    3. Set OutFile=FSO.OpenTextFile ("test2.txt",2) 'ForWriting
    4. Do While Not InFile.AtEndOfStream
    5. On Error Goto Write
    6. Line = InFile.ReadLine
    7. Fields = Split(Line,";")
    8. Typ=Fields(7)
    9. Nr=Fields(5)
    10. If Typ="muster" Then If Nr Like "50000#" Then Fields(5)="500001"
    11. Line = Join(Fields)
    12. Write:
    13. OutFile.WriteLine Line
    14. Loop
    15. Close Infile
    16. Close OutFile
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hallo petaod, vielen Dank schon mal für Deine klasse Hilfe!

    Hab mich auch schon etwas in VB eingelesen, bekomme aber leider eine Fehlermeldung in Zeile 5 / Zeichen 17
    On Error Goto Write
    liegt das eventuell an der später anschließenden Zeile

    Write:
    OutFile.WriteLine Line

    ?

    Bin gerade auf der Suche nach dem Fehler...

    Hab mich auch noch sehr damit beschäftigt und ein eigenes Skript verfasst, kam bisher aber nur zur Idee (wegen Logik :) ) die Zeile zu löschen und neu hinzuzufügen- mein Skript ist jedoch wohl sehr umständlich:

    Set MyFiles = CreateObject("Scripting.FileSystemObject")
    Const ForReading = 1, ForWriting = 2

    'FormatDateTime(Date,vblongdate)
    'strDate = wscript.echo Date
    'wscript.echo Month

    today = Date

    strNeueZeile = "20;" & Chr(34) & Chr(34) & ";" & Chr(34) & "WE" & Chr(34) & ";" & Chr(34) & Chr(34) & ";" & Chr(34) & "KST" & Chr(34) & ";" & Chr(34) & "500000" & Chr(34) & ";" & Chr(34) & Day(Today) & Month(Today) & Year(Today) & Chr(34) & ";" & Chr(34) & "muster" & Chr(34)
    '& strEingabe


    varDatei="C:\Tex\Eingabe.txt"
    varTmpDatei="C:\Tex\Ausgabe.txt"

    Set fin = MyFiles.OpenTextFile(varDatei, ForReading)
    Set fout = MyFiles.OpenTextFile(varTmpDatei, ForWriting, True)

    strSearch = "muster"

    do while not fin.AtEndOfStream
    strline = fin.readLine()
    if instr(1,strline, strSearch) = 0 then
    'Zu entfernende Zeile nicht gefunden, also Zeile ausgeben
    fout.writeline strline
    else fout.WriteLine strNeueZeile

    end If

    loop

    (das geht soweit gut...aber das Format des Datums stimmt nicht und wenn ich mehrere Suchwörter abfrage läufts auch nicht)


    Dein Posting hab ich leider erst eben gesehen...


    Grüße Edison

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Edison“ ()

    So schaut es jetzt aus (die Error Stelle habe ich auskommentiert):

    Set FSO=CreateObject ("Scripting.FileSystemObject")
    Set InFile=FSO.OpenTextFile ("C:\TEST\halli.txt",1) 'ForReading
    Set OutFile=FSO.OpenTextFile ("C:\TEST\test2.txt",2) 'ForWriting
    Do While Not InFile.AtEndOfStream
    ' On Error Goto WriteLine
    Line = InFile.ReadLine
    Fields = Split(Line,";")
    Typ=Fields(7)
    Nr=Fields(5)
    If Typ="muster" Then If Nr Like "50000#" Then Fields(5)="500001"
    Line = Join(Fields)

    OutFile.WriteLine Line
    Loop
    Close Infile
    Close OutFile



    Bekomme nun den Fehler Zeile 8 [Typ=Fields(7)] Index außerhalb des gültigen Bereichs: [number 7]?

    Gibt es auch die Möglichkeit mit dem Skript Zeilen mit unterschiedlichen Wörten z.B. "test" (siehe Beispiel, also "muster" und "test") abzufragen?

    Danke vielmals!
    Hab die Felder durchgezählt und versucht durch Kombination etwas zu bewirken:

    bringt leider nichts -vielleicht ist das Anführungszeichen ein Problem? und trennt nicht richtig?

    momentaner Code:

    Set FSO=CreateObject ("Scripting.FileSystemObject")
    Set InFile=FSO.OpenTextFile ("C:\TEST\halli.txt",1) 'ForReading
    Set OutFile=FSO.OpenTextFile ("C:\TEST\test2.txt",2) 'ForWriting
    Do While Not InFile.AtEndOfStream
    ' On Error Goto WriteLine
    Line = InFile.ReadLine
    Fields = Split(Line,";")
    Typ=Fields(5)
    Nr=Fields(3)
    If Typ="muster" Then If Nr Like "50000#" Then Fields(3)="500001"
    Line = Join(Fields)

    OutFile.WriteLine Line
    Loop
    'Close Infile
    'Close OutFile




    halli.txt lautet:

    20;"";"WE";"";"KST";"500004";"300811";"test"
    3A;"";"12103";"1";"30.08.2011";"08:08:09"
    20;"";"WE";"";"KST";"500004";"300811";"muster"
    3A;"";"12680";"1";"30.08.2011";"08:09:14


    test2.txt lautet:

    20 "" "WE" "" "KST" "500004" "300811" "test"
    3A "" "12103" "1" "30.08.2011" "08:08:09"
    20 "" "WE" "" "KST" "500004" "300811" "muster"
    3A "" "12680" "1" "30.08.2011" "08:09:14"


    Auch Semikolons sind in der Ausgabe nicht mehr vorhanden und der Zahlenwert bleibt unverändert.

    Ich überhaupt eine Abfrage von mehreren Wörten (test und muster) im Skript möglich?

    Vielen Dank!
    Semikolon gehen jetzt :) Läuft soweit super, abgesehen davon dass das Script den Zahlenstring nicht ändern möchte. ;(

    Er gibt leider immer die gleiche aus. Ich denke er findet das Feld nicht oder es gibt noch immer Probleme mit den Anführungszeichen...

    Noch eine Idee? Danke
    Dann setz mal davor eine Ausgabe und überprüf die Werte

    Visual Basic-Quellcode

    1. MsgBox "--" & Typ & "--" & Nr & "--"

    Ich sehe gerade: Du hast die Feldindexe abgeändert:

    Visual Basic-Quellcode

    1. Typ=Fields(5)
    2. Nr=Fields(3)

    Das müsste 7 und 5 sein.
    Ich kann dir nicht vorwerfen, dass du nicht auf drei zählen kannst.
    Aber bis 7 hast du anscheinend doch Probleme ;)
    (Hoffentlich habe ich mich jetzt nicht verzählt) :)
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

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

    Edison schrieb:

    Set FSO=CreateObject ("Scripting.FileSystemObject")
    Set InFile=FSO.OpenTextFile ("C:\TEST\halli.txt",1) 'ForReading
    Set OutFile=FSO.OpenTextFile ("C:\TEST\test2.txt",2) 'ForWriting
    Do While Not InFile.AtEndOfStream
    ' On Error Goto WriteLine
    Line = InFile.ReadLine
    Fields = Split(Line,";")
    Typ=Fields(7)
    Nr=Fields(5)
    If Typ="muster" Then If Nr Like "50000#" Then Fields(5)="500001"
    Line = Join(Fields)

    OutFile.WriteLine Line
    Loop
    Close Infile
    Close OutFile

    Bekomme nun den Fehler Zeile 8 [Typ=Fields(7)] Index außerhalb des gültigen Bereichs: [number 7]?




    ...hatte ich doch schon gepostet gehabt. Mit 7 und 5 läufts leider nicht. Hab jetzt mein anderes Skript ausgebaut und läuft soweit gut. Vielen Dank für die Unterstützung petaod! :thumbup:
    Die 7 und 5 stimmt schon.
    Nur hast du auch Zeilen, die weniger als 8 Felder haben.
    Die interessieren dich zwar nicht, aber die verursachen den Fehler.

    Gegen solche Formatfehler wirkt das ErrorHandling.
    Ich hab's nun selbst mal getestet.
    Fassen wir also zusammen:

    Visual Basic-Quellcode

    1. Set FSO=CreateObject ("Scripting.FileSystemObject")
    2. Set InFile=FSO.OpenTextFile ("test.txt",1) 'ForReading
    3. Set OutFile=FSO.OpenTextFile ("test2.txt",2,True) 'ForWriting
    4. Do While Not InFile.AtEndOfStream
    5. Line = InFile.ReadLine
    6. On Error Resume Next
    7. Fields = Split(Line,";")
    8. If Err.Number=0 Then
    9. Typ=Trim(Fields(7))
    10. Nr=Fields(5)
    11. If Typ="""muster""" Or Typ="""test""" Then If Nr Like """50000#""" Then Fields(5)="""500001"""
    12. Line = Join(Fields, ";")
    13. End If
    14. OutFile.WriteLine Line
    15. Loop
    16. Infile.Close
    17. OutFile.Close
    Wetten, dass es läuft? ;)
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „petaod“ ()

    Hallo petaod. sieht schon mal gut aus...habs eben auch mal getestet mit deinem Skript - bei mir ändert er aber leider nicht die Zahl in 500001 um, sondern behält die Alte (bei mir 500004) bei.

    Noch eine völlig andere Frage: gibt es eine Möglichkeit, wenn der Name der txt-Datei täglich variiert, diese über z.B. ein "C:\*.txt" in dem Skript einzulesen? :whistling:
    Meine test.txt:

    Quellcode

    1. 20;"";"WE";"";"KST";"500004";"300811";"test"
    2. 3A;"";"12103";"1";"30.08.2011";"08:08:09"
    3. 20;"";"WE";"";"KST";"500004";"300811";"muster"
    4. 3A;"";"12680";"1";"30.08.2011";"08:09:14

    Meine test2.txt:

    Quellcode

    1. 20;"";"WE";"";"KST";"500001";"300811";"test"
    2. 3A;"";"12103";"1";"30.08.2011";"500001"
    3. 20;"";"WE";"";"KST";"500001";"300811";"muster"
    4. 3A;"";"12680";"1";"30.08.2011";"500001"


    gibt es eine Möglichkeit, wenn der Name der txt-Datei täglich variiert, diese über z.B. ein "C:\*.txt" in dem Skript einzulesen

    Visual Basic-Quellcode

    1. Set Path=FSO.GetFolder("c:\test\")
    2. For Each File in Path.Files
    3. 'check File.Name ...
    4. MyFile = File.Path
    5. ConvertFile MyFile
    6. End If
    7. Next

    Und dann packst du den ganzen ConvertCode in ein Unterprogramm

    Visual Basic-Quellcode

    1. Sub ConvertFile (Filename)
    2. ...


    Das sieht dann auscodiert so aus:

    Visual Basic-Quellcode

    1. Set FSO=CreateObject ("Scripting.FileSystemObject")
    2. Set Path=FSO.GetFolder("b:\temp\")
    3. For Each File in Path.Files
    4. If Right(File.Name,4) = ".txt" Then
    5. MyFile = File.Path
    6. ConvertFile (MyFile)
    7. End If
    8. Next
    9. Sub ConvertFile (Filename)
    10. Set InFile=FSO.OpenTextFile (Filename,1) 'ForReading
    11. Set OutFile=FSO.OpenTextFile (Replace(Filename,".txt",".out",1,-1,1),2,True) 'ForWriting
    12. Do While Not InFile.AtEndOfStream
    13. Line = InFile.ReadLine
    14. On Error Resume Next
    15. Fields = Split(Line,";")
    16. If Err.Number=0 Then
    17. Typ=Trim(Fields(7))
    18. Nr=Fields(5)
    19. If Typ="""muster""" Or Typ="""test""" Then If Left(Nr,6)= """50000" Then Fields(5)="""500001"""
    20. Line = Join(Fields, ";")
    21. End If
    22. OutFile.WriteLine Line
    23. Loop
    24. Infile.Close
    25. OutFile.Close
    26. End Sub
    P.S.: Ich hab mal die Like-Operator durch andere Abfragen ersetzt.
    Vielleicht macht der in deiner Umgebung Probleme.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „petaod“ ()