calim3ro
Goto Top

Mit Batch-Datei Textdatei nach Zeichenblöcke suchen, ausschneiden und in neues Textfile einfügen

Hallo Administradoren und Mods

erstmal ein grosse Lob an diese Seite und die Benutzer, sie hat mir schon des öfteren weitergeholfen.

Ich möchte aus einem Textfile, dass mehrer zusammengehörige Zeilen (Datenblöcke) enthält, einzelne Datenböcke suchen, ausschneiden und in einem neuen Textfile einfügen.

Dies ist ein Beispiel, wie es in der Textdatei vorkommt:

@z 00002 000011 10
8509002 0 4 072257
8509004 0 3 072257
8509411 0 2 072257
8503225 0 6 072257
8503206 0 2 072257
8503202 0 6 072257
8503000 0 14 072257
8500010 2 9 072257
8509000 1 8 072257
8503209 0 3 072257
@z 00002 085000 01
8008094 0 18 000030
8500010 1 9
8500090 0 5 083466
8014350 0 1 000030
8014277 0 4
8014228 0 3 000030
@z 01110 80____ 01
8029034 0 9 053540
8014008 0 3 053540
@z 01113 000022 02
8506210 1 12 000060

usw, Textdatei ca 30mb gross

Ein Datenblock geht immer von der @z bis zur Zeile oberhalb der nächsten Zeile mit @z
Also so:

@z 00002 085000 01
8008094 0 18 000030
8500010 1 9
8500090 0 5 083466
8014350 0 1 000030
8014277 0 4
8014228 0 3 000030

Aus diesem Textfile möchte ich alle Datenblöcke, die ein 085000 beinhalten, ausschneiden und in ein anderes Textfile kopiern.

Das Batch sollte diese Operation solange durchführen, bis keine Datenblöcke mit 085000 vorhanden sind.

Leider habe ich keinen blassen Schimmer, wie ich dies angehen soll.

Hoffe jemand kann mir weiterhelfen.

Bei Unklarheitn einfach nachfragen. Besten Dank für eure Bemühungen.

Es grüsst Calimero

Content-Key: 202215

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

Printed on: April 23, 2024 at 09:04 o'clock

Member: bastla
bastla Feb 22, 2013 updated at 17:40:37 (UTC)
Goto Top
Hallo Calim3ro und willkommen im Forum!

Mit einem VBScript ließe sich das eleganter lösen als mit Batch:
Ein = "Textfile.txt"  
Aus = "Ausgeschnittene.txt"  
Markierung = "Z"  
Suche1 = "085000"  
Suche2 = "000022"  

Set fso = CreateObject("Scripting.FileSystemObject")  
T = Split(fso.OpenTextFile(Ein).ReadAll, Markierung)
Set A = fso.CreateTextFile(Aus)

For Each Block In T
    If InStr(Block, Suche1) + InStr(Block, Suche2) > 0 Then A.Write Markierung & Block
Next
Zur Not könnte das Script auch von einem Batch (temporär) erzeugt werden.

Grüße
bastla

[Edit] Verwendung eines zweiten Suchbegriffs ergänzt [/Edit]
Member: Calim3ro
Calim3ro Feb 22, 2013 at 16:05:16 (UTC)
Goto Top
Hallo bastla

Wow, ging ja schnell! Habe es ausprobiert und funktioniert 1A.

Besten Dank dafür.

Gruss Calimero
Member: Calim3ro
Calim3ro Feb 22, 2013 at 16:47:53 (UTC)
Goto Top
Eine Frage habe ich allerdings noch:

Wie muss der vbs-Script angepasst werden, damit noch nach einer zweiten Nummer gesucht und den Block in das selbe Textfile kopiert? zB. 000022

Einfach den ersten Skript unter den ersten kopieren und Suche anpassen war leider nicht...

Danke für die Bemühungen.
Member: bastla
bastla Feb 22, 2013 at 17:42:41 (UTC)
Goto Top
Hallo Calim3ro!

Habe oben eine (ungetestete) Anpassung vorgenommen.

Sollten es noch mehr Suchbegriffe werden, würde ich das allerdings etwas modifizieren ...

Grüße
bastla
Member: Calim3ro
Calim3ro Feb 22, 2013 at 18:22:47 (UTC)
Goto Top
Hallo bastla

Getestet und geht prima. Auch das hinzufügen von einer Suche3 klappt.

Aber es werden noch ca. 15 verschieden Suchzahlen hinzukommen.

Wie sähe da Deine Modifikation aus?

Besten Dank nochmal

Gruss Calimero
Member: bastla
bastla Feb 22, 2013 at 18:43:04 (UTC)
Goto Top
Hallo Calim3ro!

Bei einer größeren Anzahl an Suchbegriffen könntest Du die folgende Variante testen (ich hab's nicht gemacht face-wink):
Ein = "Textfile.txt"  
Aus = "Ausgeschnittene.txt"  
Markierung = "Z"  
Suche = Array("085000", "000022", "112233", "555555")  

Set fso = CreateObject("Scripting.FileSystemObject")  
T = Split(fso.OpenTextFile(Ein).ReadAll, Markierung)
Set A = fso.CreateTextFile(Aus)

For Each Block In T
    Gefunden = False
    For Each Suchwort In Suche
        If InStr(Block, Suchwort) > 0 Then
            Gefunden = True
            Exit For
        End If
    Next
    If Gefunden Then A.Write Markierung & Block
Next
Weitere Alternative: Eine Textdatei, die je ein Suchwort pro Zeile enthält, bereitstellen und am Scriptanfang einmalig in ein Array einlesen - das könnte dann so aussehen:
Ein = "Textfile.txt"  
Aus = "Ausgeschnittene.txt"  
Markierung = "Z"  
Suche = "Suchbegriffe.txt"  

Set fso = CreateObject("Scripting.FileSystemObject")  
T = Split(fso.OpenTextFile(Ein).ReadAll, Markierung)
S = Split(fso.OpenTextFile(Suche).ReadAll, vbNewline)
Set A = fso.CreateTextFile(Aus)

For Each Block In T
    Gefunden = False
    For Each Suchwort In S
        If InStr(Block, Suchwort) > 0 Then
            Gefunden = True
            Exit For
        End If
    Next
    If Gefunden Then A.Write Markierung & Block
Next
Achtung: In der Datei "Suchbegriffe.txt" keine Leerzeilen (und auch keine Zeilenschaltung nach der letzten Zeile) verwenden!

Grüße
bastla
Member: Calim3ro
Calim3ro Feb 22, 2013 at 19:12:55 (UTC)
Goto Top
Hallo bastla

Habe mich für die zweite Version mit der "Suchbegriffe.txt" entschieden, damit bin ich flexibler falls noch welche dazukommen oder wegfallen.

Hat super geklappt! Danke Dir vielmal. Falls noch Fragen auftauchen, darf ich mich sicher wieder melden.

Bis dann...

Gruss Calimero