m.matt85
Goto Top

Bestimmte Zeilen mit VBS in eine neue TXT Datei übernehmen

Hallo an Alle,

ich habe folgendes Problem:

Eine Textdatei besteht aus mehreren Zeilen, ab einer Leerzeile beginnen die Datensätze die für mich wichtig sind.

Ich muss nun mit VBS ab der Leerzeile prüfen ob ein ; am Schluss steht oder nicht. Wenn ein ; am Schluss steht soll die Zeile gelöscht werden. Falls keines am Schluss steht soll die jeweilige Zeile außer dem letzten Wert übernomen werden.

z.B. xxxxxx - xxxxxxx;0.000;0.400;0.000;0.125;0.125

d.h. der Wert 0.125 muss gelöscht werden der Rest übernommen.

Habe mal was gefunden, weiß allerdings nicht ob mir der Befehl hier weiterhilft.

intPosRev = InStrRev(strText,",",20)

Kann mir da jemand weiterhelfen wie ich die Sache am Besten programmiere?
Wäre um jede Hilfe dankbar!
Grüße

Content-Key: 168368

Url: https://administrator.de/contentid/168368

Printed on: April 19, 2024 at 08:04 o'clock

Member: bastla
bastla Jun 21, 2011 at 08:27:54 (UTC)
Goto Top
Hallo m.matt85 und willkommen im Forum!

Etwa so:
Ein = "D:\Text_alt.txt"  
Aus = "D:\Text_neu.txt"  
Delim = ";" 'Trennzeichen für Felder  

Set fso = CreateObject("Scripting.FileSystemObject")  
'gesamten Text in Zeilen-Array einlesen  
Zeilen = Split(fso.OpenTextFile(Ein).ReadAll, vbCrLf)

'Ausgabedatei erzeugen  
Set AusDatei = fso.CreateTextFile(Aus)
'Flag für "Sollen Zeilen ab jetzt geschrieben werden?" initialisieren  
Schreiben = False

'Schleife über alle Zeilen  
For i = 0 To UBound(Zeilen)
    'Falls bereits geschrieben werden soll und die Zeile nicht mit dem Trennzeichen endet  
    If Schreiben And Right(Zeilen(i), 1) <> Delim Then
        'Zeile anhand des Trennzeichens in ein Array "Felder" zerlegen  
        Felder = Split(Zeilen(i), Delim)
        'Leerzeilen berücksichtigen  
        If UBound(Felder) >= 0 Then
            'Inhalt des letzten Feldes löschen  
            Felder(UBound(Felder)) = ""  
            'Felder wieder (mit Trennzeichen) zu einer Zeile zusammenfügen  
            AusZeile = Join(Felder, Delim)
            'Zeile in die Datei schreiben; dabei das überzählige Trennzeichen am Ende abschneiden  
            AusDatei.WriteLine Left(AusZeile, Len(AusZeile) - 1)
        End If
    Else
        'Wenn Leerzeile gefunden, folgende Zeilen schreiben  
        If Zeilen(i) = "" Then Schreiben = True  
    End If
Next
Grüße
bastla
Member: m.matt85
m.matt85 Jun 21, 2011 at 08:53:20 (UTC)
Goto Top
Danke für deine schnelle Antwort und Hilfe!

Es passt soweit und funktioniert fast face-smile , das Programm sollte mir nur die Zeilen ausgeben bei denen ein Wert am Schluss steht, doch momentan werden mehrer Zeilen ausgegeben.

xxxxxx - xxxxxxx;0.000;0.400;0.000;0.125;0.125

Mit dem Programm steht die Zeile nun folgendermaßen in der neuen Datei:

xxxxxx - xxxxxxx;0.000;0.400;0.000 --> es werden die letzten 2 Werte gelöscht.

Die Textdatei besitzt einen Kopf der erhalten bleibt. Ab der Leerzeile befinden sich die Zeilen die mit dem Programm bearbeitet werden.

Kannst du mir vll noch kurz erklären was du mit Leerzeile berücksichtigen und der Letzten if Bedingung meinst?
Wäre super!

Danke für die ausführliche Beschreibung deines Programmes!

Vielen dank!
Mitglied: 76109
76109 Jun 21, 2011 at 09:19:29 (UTC)
Goto Top
Hallo m.matt85!

Ändere mal Codezeile 21:
If UBound(Felder) = 5 Then 

Wenn auch mehr als 6 Felder vorkommen können/dürfen, dann:
If UBound(Felder) >= 5 Then 

Gruß Dieter
Member: bastla
bastla Jun 21, 2011 at 09:31:42 (UTC)
Goto Top
Hallo m.matt85!

Ich kann zwar anhand Deines Beispieles den Fehler nicht nachvollziehen, aber versuch es alternativ mit der folgenden Schleife (ab Zeile 15):
For i = 0 To UBound(Zeilen)
    'Falls bereits geschrieben werden soll und die Zeile nicht mit dem Trennzeichen endet   
    If Schreiben And Right(Zeilen(i), 1) <> Delim Then
        'Zeichenanzahl vor dem letzten Trennzeichen ermitteln  
        L = InStrRev(Zeilen(i), Delim) - 1
        'Wenn es Text vor dem letzten Trennzeichen gibt, ...  
        If L > 0 Then
            '... nur diesen schreiben, ...  
             AusDatei.WriteLine Left(Zeilen(i), L)
        Else
            '... ansonsten die Zeile unverändert ausgeben  
             AusDatei.WriteLine Zeilen(i)
        End If
    Else
        'Wenn Leerzeile gefunden, folgende Zeilen schreiben   
        If Zeilen(i) = "" Then Schreiben = True  
    End If
Next
Kannst du mir vll noch kurz erklären was du mit Leerzeile berücksichtigen und der Letzten if Bedingung meinst?
Ich hatte das so interpretiert, dass erst nach der ersten Leerzeile Zeilen untersucht und ausgegeben werden sollen - daher wird erst dann das Schreiben "freigegeben" ...

Sollen die Kopfzeile (bis zur ersten Leerzeile) unverändert übernommen werden, müsste die Schleife eher so aussehen:
'Flag für "Sollen Zeilen ab jetzt bearbeitet werden?" initialisieren   
Bearbeiten = False
For i = 0 To UBound(Zeilen)
    'Falls bearbeitet werden soll (keine Kopfzeile mehr)  
    If Bearbeiten Then
        'Zeile nur übernehmen,wenn nicht Trennzeichen am Ende  
        If Right(Zeilen(i), 1) <> Delim Then
            'Zeichenanzahl vor dem letzten Trennzeichen ermitteln  
            L = InStrRev(Zeilen(i), Delim) - 1
        'Wenn es Text vor dem letzten Trennzeichen gibt, ...  
            If L > 0 Then
            '... nur diesen schreiben, ...  
                AusDatei.WriteLine Left(Zeilen(i), L)
            Else
            '... ansonsten die Zeile unverändert ausgeben  
                AusDatei.WriteLine Zeilen(i)
            End If
        End If
    Else
        'Kopfzeile - daher unverändert ausgeben  
        AusDatei.WriteLine Zeilen(i)
        'Wenn Leerzeile gefunden, folgende Zeilen bearbeiten   
        If Zeilen(i) = "" Then Bearbeiten = True  
    End If
Next
Grüße
bastla
Member: bastla
bastla Jun 21, 2011 at 10:11:47 (UTC)
Goto Top
@Dieter
Der Test auf
UBound(Felder) > 0
soll nur verhindern, dass
Felder(UBound(Felder)) = ""
danabengeht - für eine Leerzeile ergibt "UBound(Felder)" nämlich -1...

Grüße
bastla
Mitglied: 76109
76109 Jun 21, 2011 at 10:44:29 (UTC)
Goto Top
Hallo bastla!

Das ist mir schon klar, aber ich habe es so verstanden bzw. vermutet, dass es mehre unterschiedliche Datensätze gibt und m.matt85 eben nur diese speziellen Datensätze auslesen will. Kann natürlich auch sein, wie Du ja schon angedeutet hast, dass es mehrere Leerzeilen gibt oder wie auch immer (Ratespiel)face-wink

Gruß Dieter
Member: m.matt85
m.matt85 Jun 21, 2011 at 11:19:12 (UTC)
Goto Top
@76109 :es gibt entweder 5 Felder ( wenn nach dem ; kein Wert mehr steht) oder 6 Felder ( wenn nach dem ; ein Wert steht)

@ bastla :das mit der Kopfzeile und mit der veränderten Schleife funktioniert. face-smile

Vielen vielen Dank für eure Hilfe!

Grüße