In einem File nach Zeilenblöcken suchen und Zeilen hinzufügen. (CMD, Pearl,VCS)
Hallo ihr schlauen Köpfe
Zuerst: Ich habe nur wenig Ahnung von Programierung.
Zur Situation:
Ich habe ein grosses File (1,5 GB) mit Zeichenblöcken.
Diese sehen folgendermasen aus:
11 AAAAAAA
22 BBBBBBB
33 CCCCCCC
44 DDDDDDD
55 EEEEEEE
11 FFFFFFFF
22 GGGGGG
44 JJJJJJJJJJ
55 KKKKKKK
Ein Zeichenblock fängt immer mit 11 an.
Nun möchte ich folgendes tun:
Das File durchsuchen und Zeichenblöcke die ein 11 und 33 beinhalten, die Information hinter dem 11 unten an den Block schreiben. Vor dieser Information soll immer 99 stehen.
Falls in einem Block kein 33 vorkommt, muss dieser unverändert bleiben.
Am Ende soll das obere Beispiel folgendermasen aussehen:
11 AAAAAAA
22 BBBBBBB
33 CCCCCCC
44 DDDDDDD
55 EEEEEEE
99 AAAAAAA
11 FFFFFFFF
22 GGGGGG
44 JJJJJJJJJJ
55 KKKKKKK
Bevorzugte Skripts sind Pearl oder VCS, bin aber auch offen für andere Formate.
Ich hoffe ich konnte das gewünschte Vorgehen gut beschreiben, bei Unklarheiten einfach nachfragen.
Besten Dank an alle, die sich meinem Problem annehmen und etwas beisteuern können.
Gruss Calimero
Zuerst: Ich habe nur wenig Ahnung von Programierung.
Zur Situation:
Ich habe ein grosses File (1,5 GB) mit Zeichenblöcken.
Diese sehen folgendermasen aus:
11 AAAAAAA
22 BBBBBBB
33 CCCCCCC
44 DDDDDDD
55 EEEEEEE
11 FFFFFFFF
22 GGGGGG
44 JJJJJJJJJJ
55 KKKKKKK
Ein Zeichenblock fängt immer mit 11 an.
Nun möchte ich folgendes tun:
Das File durchsuchen und Zeichenblöcke die ein 11 und 33 beinhalten, die Information hinter dem 11 unten an den Block schreiben. Vor dieser Information soll immer 99 stehen.
Falls in einem Block kein 33 vorkommt, muss dieser unverändert bleiben.
Am Ende soll das obere Beispiel folgendermasen aussehen:
11 AAAAAAA
22 BBBBBBB
33 CCCCCCC
44 DDDDDDD
55 EEEEEEE
99 AAAAAAA
11 FFFFFFFF
22 GGGGGG
44 JJJJJJJJJJ
55 KKKKKKK
Bevorzugte Skripts sind Pearl oder VCS, bin aber auch offen für andere Formate.
Ich hoffe ich konnte das gewünschte Vorgehen gut beschreiben, bei Unklarheiten einfach nachfragen.
Besten Dank an alle, die sich meinem Problem annehmen und etwas beisteuern können.
Gruss Calimero
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 210597
Url: https://administrator.de/contentid/210597
Ausgedruckt am: 24.11.2024 um 06:11 Uhr
24 Kommentare
Neuester Kommentar
Hallo Calim3ro!
Unter der Annahme, dass jeder Block mit einer Leerzeile endet (und die letzte Zeile der Datei ebenfalls leer ist) und die Blöcke keine "besonderen" Sonderzeichen enthalten, könnte das als Batch etwa so gehen (laufen wird's bei der Dateigröße eher nicht ):
Alternative (setzt keine Leerzeile am Ende des Blocks voraus, erzeugt aber eine im Ergebnis - falls nicht gewünscht, Zeile 14 entfernen):
Grüße
bastla
[Edit] Berücksichtigung des letzten Blocks ergänzt und Alternativvariante hinzugefügt [/Edit]
Unter der Annahme, dass jeder Block mit einer Leerzeile endet (und die letzte Zeile der Datei ebenfalls leer ist) und die Blöcke keine "besonderen" Sonderzeichen enthalten, könnte das als Batch etwa so gehen (laufen wird's bei der Dateigröße eher nicht ):
@echo off & setlocal
set "Ein=D:\Datei.txt"
set "Aus=D:\Datei_neu.txt"
(for /f "tokens=1* delims=: " %%i in ('findstr /n "^" "%Ein%"') do (
for /f "tokens=1*" %%a in ("%%j") do (
if "%%a"=="11" set "Wert=%%b"
if "%%a"=="33" if defined Wert set "Schreiben=true"
)
if "%%j"=="" if defined Schreiben (
setlocal enabledelayedexpansion
echo 99 !Wert!
endlocal
set "Schreiben="
set "Wert="
)
echo(%%j
))>"%Aus%"
if defined Schreiben >>"%Aus%" echo 99 %Wert%
@echo off & setlocal
set "Ein=Datei.txt"
set "Aus=Datei_neu.txt"
(for /f "usebackq delims=" %%i in ("%Ein%") do (
for /f "tokens=1*" %%a in ("%%i") do (
if "%%a"=="11" (
if defined Schreiben (
setlocal enabledelayedexpansion
echo 99 !Wert!
endlocal
set "Schreiben="
)
if defined Wert echo(
set "Wert=%%b"
)
if "%%a"=="33" set "Schreiben=true"
)
echo(%%i
))>"%Aus%"
if defined Schreiben >>"%Aus%" echo 99 %Wert%
bastla
[Edit] Berücksichtigung des letzten Blocks ergänzt und Alternativvariante hinzugefügt [/Edit]
Hallo Calim3ro!
In Batch ist das "Vorausschauen" (ob im Block eine Zeile mit "33" folgt) bereits nach der "11"-Zeile etwas tricky - in VBS geht's leichter:
Die Datei mit derm Positivliste muss jeden (6-stelligen) Vergleichswert in einer eigenen Zeile enthalten. Beim Vergleich wird Groß-/Kleinschreibung berücksichtigt.
Grüße
bastla
In Batch ist das "Vorausschauen" (ob im Block eine Zeile mit "33" folgt) bereits nach der "11"-Zeile etwas tricky - in VBS geht's leichter:
Ein = "D:\Datei.txt"
Aus = "D:\Datei_neu.txt"
Liste = "D:\Positivliste.txt"
Kenn = "11"
Kenn2 = "33"
Einf = "99"
PStart = 10
PEnde = 15
KLen = Len(Kenn) 'Längen der Teilstrings vor der Schleife ...
PLen = PEnde - PStart + 1 '... und damit nur einmal berechnen
Mark = "§§§" 'Platzhalter für einzufügende Zeile; darf in der zu verarbeitenden Datei nicht enthalten sein
Set fso = CreateObject("Scripting.FileSystemObject")
Set E = fso.OpenTextFile(Ein)
Set A = fso.CreateTextFile(Aus)
'Positivliste so in Variable einlesen, dass jeder Eintrag durch eine Zeilenschaltung begrenzt ist
L = vbNewline & fso.OpenTextFile(Liste).ReadAll & vbNewLine
Do While Not E.AtEndOfStream
Z = E.ReadLine
If Left(Z, KLen) = Kenn Then 'Blockbeginn?
If Krit1 * Krit2 = 1 Then 'wenn beide Kriterien erfüllt sind ...
'... Block schreiben und dabei Zusatz-Zeile für Platzhalter (lt Var "Mark") einsetzen ...
A.Write Replace(Block, Mark, vbNewline & Einf & Wert)
Else ' ... ansonsten ...
A.Write Replace(Block, Mark, "") '... Platzhalter vor dem Schreiben rückstandsfrei entfernen
End If
If Wert <> "" Then 'ab zweitem Block ...
'... neuen Block mit Zeilenschaltung (vorhergehender Block endet ohne Zeilenschaltung) beginnen
Block = vbNewLine & Z & Mark
Else
Block = Z & Mark
End If
Wert = Mid(Z, KLen + 1)
'Teilstring in "L" (Liste) suchen und Ergebnis als 0 oder 1 speichern
Krit1 = Sgn(InStr(L, vbNewline & Mid(Z, PStart, PLen) & vbNewline))
Krit2 = 0 'Kriterium Kennung 2 rücksetzen
Else
Block = Block & vbNewline & Z 'Zeile an Block mit Zeilenschaltung anfügen
End If
If Left(Z, KLen) = Kenn2 Then Krit2 = 1 'auf 2. Kriterium ("33") prüfen
Loop
'letzten Block verarbeiten
If Krit1 * Krit2 = 1 Then 'wenn beide Kriterien erfüllt sind ...
'... Block schreiben und dabei Zusatz-Zeile für Platzhalter (lt Var "Mark") einsetzen ...
A.Write Replace(Block, Mark, vbNewline & Einf & Wert)
Else ' ... ansonsten ...
A.Write Replace(Block, Mark, "") '... Platzhalter vor dem Schreiben rückstandsfrei entfernen
End If
Grüße
bastla
Hallo zusammen!
Und zur Ergänzung noch die Kurzform:
Gruß Dieter
Und zur Ergänzung noch die Kurzform:
Const sFileEin = "E:\Eingabe.txt"
Const sFileAus = "E:\Ausgabe.txt"
Const sFileListe = "E:\Liste.txt"
Const iTestPos = 10
Const iTestLen = 6
Set oFso = CreateObject("Scripting.FileSystemObject")
sTest = vbCrLf & oFso.OpenTextFile(sFileListe).ReadAll
aText = Split(vbCrLf & oFso.OpenTextFile(sFileEin).ReadAll, vbCrLf & "11")
For i = 1 To UBound(aText)
If aText(i) <> "" Then
sTarget = "11" & Split(aText(i), vbCrLf)(0)
sSearch = vbCrLf & Mid(sTarget, iTestPos, iTestLen)
If InStr(aText(i), vbCrLf & "33 ") > 0 And InStr(sTest, sSearch) > 0 Then
aText(i) = sTarget & vbCrLf & "99" & aText(i)
Else
aText(i) = "11" & aText(i)
End If
End If
Next
oFso.CreateTextFile(sFileAus).Write Mid(Join(aText, vbCrLf), 3)
Gruß Dieter
Hallo bastla!
Hinsichtlich der Dateigröße würde ich Dein Script auch bevorzugen. Mein Script (getestet) funktioniert nur mit kleineren Dateien..
Gruß Dieter
[edit]
Hab mal getestet und es hakt schon beim Versuch eine 576 MB-Datei in einen String einzulesen. Notepad und Notepad++ packens auch nicht
Und das trotz verfügbarem physikalischen Arbeitsspeicher von ca. 2,6 GB?
So sollte es dann auch mit überdimensionierten Dateien funktionieren:
[/edit]
Hinsichtlich der Dateigröße würde ich Dein Script auch bevorzugen. Mein Script (getestet) funktioniert nur mit kleineren Dateien..
Gruß Dieter
[edit]
Hab mal getestet und es hakt schon beim Versuch eine 576 MB-Datei in einen String einzulesen. Notepad und Notepad++ packens auch nicht
Und das trotz verfügbarem physikalischen Arbeitsspeicher von ca. 2,6 GB?
So sollte es dann auch mit überdimensionierten Dateien funktionieren:
Const sFileEin = "E:\Eingabe.txt"
Const sFileAus = "E:\Ausgabe.txt"
Const sFileListe = "E:\Liste.txt"
Const iFindPos = 10
Const iFindLen = 6
Set oFso = CreateObject("Scripting.FileSystemObject")
Set oList = CreateObject("Scripting.Dictionary")
Set oFileEin = oFso.OpenTextFile(sFileEin)
Set oFileAus = oFso.CreateTextFile(sFileAus)
sComp = vbCrLf & oFso.OpenTextFile(sFileListe).ReadAll
Do Until oFileEin.AtEndOfStream
sText = oFileEin.ReadLine
If Left(sText, 2) = "11" Then
oList.Add "11", sText
oList.Add "99", "99" & Mid(sText, 3)
ElseIf sText <> "" Then
oList.Add Left(sText, 2), sText
End If
If sText = "" Or oFileEin.AtEndOfStream = True Then
If oList.Exists("11") Then
sFind = vbCrLf & Mid(oList.Item("11"), iFindPos, iFindLen)
If oList.Exists("33") = False Or InStr(sComp, sFind) < 1 Then
oList.Remove "99"
End If
End If
If oFileEin.AtEndOfStream Then sFreeLine = "" Else sFreeLine = vbCrLf
oFileAus.Write Join(oList.Items, vbCrLf) & vbCrLf & sFreeLine
oList.RemoveAll
End If
Loop
oFileEin.Close: oFileAus.Close
Hallo Calim3ro!
Der Cmd-Aufruf sollte gehen, indem Du in bastlas Script die Codezeilen 1-3 entfernst und die Codezeile 16 durch diese Codezeilen ersetzt:
Und im Cmd-Script in etwa so:
Gruß Dieter
Der Cmd-Aufruf sollte gehen, indem Du in bastlas Script die Codezeilen 1-3 entfernst und die Codezeile 16 durch diese Codezeilen ersetzt:
With WScript.Arguments
If .Count <> 3 Then
WScript.Echo "Falsche Anzahl an Argumenten!": WScript.Quit 1
Else
Ein = .Item(0): Aus = .Item(1): Liste = .Item(2)
End If
End With
Set fso = CreateObject("Scripting.FileSystemObject")
If Not fso.FileExists(Ein) Or Not fso.FileExists(Aus) Or Not fso.FileExists(Liste) Then
WScript.Echo "Datei nicht gefunden!": WScript.Quit 1
End If
@echo off & setlocal
set "VbsScript=C:\Tools\Mein Script.vbs"
set "DateiEin=C:\Mein Verzeichnis\Eingabe.txt"
set "DateiAus=C:\Mein Verzeichnis\Ausgabe.txt"
set "DateiListe=C:\Mein Verzeichnis\Liste.txt"
CScript //nologo "%VbsScript%" "%DateiEin%" "%DateiAus%" "%DateiListe%"
Gruß Dieter
Hallo Calim3ro und Dieter!
Die angepasste (aber völlig ungetestete) Version des Scripts könnte dann so aussehen:
Grüße
bastla
Die angepasste (aber völlig ungetestete) Version des Scripts könnte dann so aussehen:
Kenn = "11"
Kenn2 = "33"
P2Start = 10
P2Ende = 15
Kenn3 = "44"
P3Start = 5
P3Ende = 9
Einf = "99"
With WScript.Arguments
If .Count <> 3 Then
WScript.Echo "Falsche Anzahl an Argumenten!"
WScript.Quit 1
Else
Ein = .Item(0)
Aus = .Item(1)
Liste = .Item(2)
End If
End With
KLen = Len(Kenn) 'Längen der Teilstrings vor der Schleife ...
P2Len = P2Ende - P2Start + 1 '...
P3Len = P3Ende - P3Start + 1 '... und damit nur einmal berechnen
Mark = "§§§" 'Platzhalter für einzufügende Zeile; darf in der zu verarbeitenden Datei nicht enthalten sein
Set fso = CreateObject("Scripting.FileSystemObject")
Set E = fso.OpenTextFile(Ein)
Set A = fso.CreateTextFile(Aus)
'Positivliste so in Variable einlesen, dass jeder Eintrag durch eine Zeilenschaltung begrenzt ist
L = vbNewline & fso.OpenTextFile(Liste).ReadAll & vbNewLine
Do While Not E.AtEndOfStream
Z = E.ReadLine
If Left(Z, KLen) = Kenn Then 'Blockbeginn?
If Krit1 * Krit2 = 1 Then 'wenn beide Kriterien erfüllt sind ...
'... Block schreiben und dabei Zusatz-Zeile für Platzhalter (lt Var "Mark") einsetzen ...
A.Write Replace(Block, Mark, vbNewline & Einf & Wert)
Else ' ... ansonsten ...
A.Write Replace(Block, Mark, "") '... Platzhalter vor dem Schreiben rückstandsfrei entfernen
End If
If Wert <> "" Then 'ab zweitem Block ...
'... neuen Block mit Zeilenschaltung (vorhergehender Block endet ohne Zeilenschaltung) beginnen
Block = vbNewLine & Z & Mark
Else
Block = Z & Mark
End If
Wert = Mid(Z, KLen + 1)
'Teilstring in "L" (Liste) suchen und Ergebnis als 0 oder 1 speichern
Krit1 = Sgn(InStr(L, vbNewline & Mid(Z, P2Start, P2Len) & vbNewline))
Krit2 = 0 'Kriterium Kennung 2 rücksetzen
Else
Block = Block & vbNewline & Z 'Zeile an Block mit Zeilenschaltung anfügen
End If
If Left(Z, KLen) = Kenn2 Then Krit2 = 1 'auf 2. Kriterium ("33") prüfen
'zusätzlichen Teilstring nach einem Leerzeichen an die Zusatzzeile anfügen
If Left(Z, KLen) = Kenn3 Then Wert = Wert & " " & Mid(Z, P3Start, P3Len)
Loop
'letzten Block verarbeiten
If Krit1 * Krit2 = 1 Then 'wenn beide Kriterien erfüllt sind ...
'... Block schreiben und dabei Zusatz-Zeile für Platzhalter (lt Var "Mark") einsetzen ...
A.Write Replace(Block, Mark, vbNewline & Einf & Wert)
Else ' ... ansonsten ...
A.Write Replace(Block, Mark, "") '... Platzhalter vor dem Schreiben rückstandsfrei entfernen
End If
bastla
Hallo Calim3ro!
Gruß Dieter
Liegt das daran, dass ich Skript-Zeile 49. Wert = Mid(Z, KLen +1) durch Wert = Mid(Z, 3, 6) ersetzt habe? Brauche aus der 11er-Zeile nur die Information der Position 3-6...
Das spielt eigentlich keine Rolle, allerdings sind es von Position 3-6 nur 4 Zeichen und mit Mid(Z, 3, 6) liest Du aber 6 Zeichen ab Position 3. Der letzte Parameter steht für Anzahl...Gruß Dieter
Hallo Calim3ro!
Ich hoffe, Dich richtig verstanden zu haben - falls ja, könnte das so gehen (wie immer ungetestet ):
Hinsichtlich der Zeile 57 (oben: 49) müsstest Du ggf wieder selbst die Anpassung an die richtige Position / Zeichenanzahl vornehmen.
Die Ausgabeliste ist beim Aufruf als zusätzlicher Parameter (siehe Zeile 20) zu übergeben.
Grüße
bastla
Ich hoffe, Dich richtig verstanden zu haben - falls ja, könnte das so gehen (wie immer ungetestet ):
Kenn = "11"
Kenn2 = "33"
P2Start = 10
P2Ende = 15
Kenn3 = "44"
P3Start = 5
P3Ende = 9
Einf = "99"
NStart = 50000
Stellen = 6
With WScript.Arguments
If .Count <> 4 Then
WScript.Echo "Falsche Anzahl an Argumenten!"
WScript.Quit 1
Else
Ein = .Item(0)
Aus = .Item(1)
Liste = .Item(2)
AListe = .Item(3)
End If
End With
Nummer = 10 ^ Stellen + NStart 'Startwert (um eine Zehnerpotenz größer als lt "Stellen" wegen der führenden Nullen) erzeugen
KLen = Len(Kenn) 'Längen der Teilstrings vor der Schleife ...
P2Len = P2Ende - P2Start + 1 '...
P3Len = P3Ende - P3Start + 1 '... und damit nur einmal berechnen
Mark = "§§§" 'Platzhalter für einzufügende Zeile; darf in der zu verarbeitenden Datei nicht enthalten sein
Set fso = CreateObject("Scripting.FileSystemObject")
Set E = fso.OpenTextFile(Ein)
Set A = fso.CreateTextFile(Aus)
Set AL = fso.CreateTextFile(AListe)
'Positivliste so in Variable einlesen, dass jeder Eintrag durch eine Zeilenschaltung begrenzt ist
L = vbNewline & fso.OpenTextFile(Liste).ReadAll & vbNewLine
Do While Not E.AtEndOfStream
Z = E.ReadLine
If Left(Z, KLen) = Kenn Then 'Blockbeginn?
If Krit1 * Krit2 = 1 Then 'wenn beide Kriterien erfüllt sind ...
'... Block schreiben und dabei Zusatz-Zeile für Platzhalter (lt Var "Mark") einsetzen ...
A.Write Replace(Block, Mark, vbNewline & Einf & Zusatz)
'Zeile mit Nummer und Wert aus Zeile "Krit1" in Ausgabeliste schreiben
AL.WriteLine Right(Nummer, Stellen) & " " & Wert
Nummer = Nummer + 1 'Nummer weiterzählen
Else ' ... ansonsten ...
A.Write Replace(Block, Mark, "") '... Platzhalter vor dem Schreiben rückstandsfrei entfernen
End If
If Wert <> "" Then 'ab zweitem Block ...
'... neuen Block mit Zeilenschaltung (vorhergehender Block endet ohne Zeilenschaltung) beginnen
Block = vbNewLine & Z & Mark
Else
Block = Z & Mark
End If
Wert = Mid(Z, KLen + 1)
'Teilstring in "L" (Liste) suchen und Ergebnis als 0 oder 1 speichern
Krit1 = Sgn(InStr(L, vbNewline & Mid(Z, P2Start, P2Len) & vbNewline))
Krit2 = 0 'Kriterium Kennung 2 rücksetzen
Else
Block = Block & vbNewline & Z 'Zeile an Block mit Zeilenschaltung anfügen
End If
If Left(Z, KLen) = Kenn2 Then Krit2 = 1 'auf 2. Kriterium ("33") prüfen
'zusätzlichen Teilstring nach einem Leerzeichen an die Zusatzzeile anfügen
If Left(Z, KLen) = Kenn3 Then Zusatz = Mid(Z, P3Start, P3Len) & " " & Right(Nummer, Stellen)
Loop
'letzten Block verarbeiten
If Krit1 * Krit2 = 1 Then 'wenn beide Kriterien erfüllt sind ...
'... Block schreiben und dabei Zusatz-Zeile für Platzhalter (lt Var "Mark") einsetzen ...
A.Write Replace(Block, Mark, vbNewline & Einf & Zusatz)
'Zeile mit Nummer und Wert aus Zeile "Krit1" in Ausgabeliste schreiben
AL.WriteLine Right(Nummer, Stellen) & " " & Wert
Else ' ... ansonsten ...
A.Write Replace(Block, Mark, "") '... Platzhalter vor dem Schreiben rückstandsfrei entfernen
End If
Die Ausgabeliste ist beim Aufruf als zusätzlicher Parameter (siehe Zeile 20) zu übergeben.
Grüße
bastla
Hallo Calim3ro!
Einmal mehr ohne Test meinerseits:
Neu ist die Zeile 9 zum Festlegen des zu entfernenden Zeichens ("Q") und der Block in den Zeilen 59 - 61, in dem die führenden "Q" abgetrennt werden.
Grüße
bastla
Einmal mehr ohne Test meinerseits:
Kenn = "11"
Kenn2 = "33"
P2Start = 10
P2Ende = 15
Kenn3 = "44"
P3Start = 5
P3Ende = 9
Einf = "99"
Entf = "Q" 'zu entfernendes Zeichen am Beginn des Wertes für die Ausgabeliste
NStart = 50000
Stellen = 6
With WScript.Arguments
If .Count <> 4 Then
WScript.Echo "Falsche Anzahl an Argumenten!"
WScript.Quit 1
Else
Ein = .Item(0)
Aus = .Item(1)
Liste = .Item(2)
AListe = .Item(3)
End If
End With
Nummer = 10 ^ Stellen + NStart 'Startwert (um eine Zehnerpotenz größer als lt "Stellen" wegen der führenden Nullen) erzeugen
KLen = Len(Kenn) 'Längen der Teilstrings vor der Schleife ...
P2Len = P2Ende - P2Start + 1 '...
P3Len = P3Ende - P3Start + 1 '... und damit nur einmal berechnen
Mark = "§§§" 'Platzhalter für einzufügende Zeile; darf in der zu verarbeitenden Datei nicht enthalten sein
Set fso = CreateObject("Scripting.FileSystemObject")
Set E = fso.OpenTextFile(Ein)
Set A = fso.CreateTextFile(Aus)
Set AL = fso.CreateTextFile(AListe)
'Positivliste so in Variable einlesen, dass jeder Eintrag durch eine Zeilenschaltung begrenzt ist
L = vbNewline & fso.OpenTextFile(Liste).ReadAll & vbNewLine
Do While Not E.AtEndOfStream
Z = E.ReadLine
If Left(Z, KLen) = Kenn Then 'Blockbeginn?
If Krit1 * Krit2 = 1 Then 'wenn beide Kriterien erfüllt sind ...
'... Block schreiben und dabei Zusatz-Zeile für Platzhalter (lt Var "Mark") einsetzen ...
A.Write Replace(Block, Mark, vbNewline & Einf & Zusatz)
'Zeile mit Nummer und Wert aus Zeile "Krit1" in Ausgabeliste schreiben
AL.WriteLine Right(Nummer, Stellen) & " " & Wert
Nummer = Nummer + 1 'Nummer weiterzählen
Else ' ... ansonsten ...
A.Write Replace(Block, Mark, "") '... Platzhalter vor dem Schreiben rückstandsfrei entfernen
End If
If Wert <> "" Then 'ab zweitem Block ...
'... neuen Block mit Zeilenschaltung (vorhergehender Block endet ohne Zeilenschaltung) beginnen
Block = vbNewLine & Z & Mark
Else
Block = Z & Mark
End If
Wert = Mid(Z, KLen + 1) 'Wert auslesen
Do While Left(Wert, 1) = Entf 'Solange Wert mit Zeichen lt "Entf" beginnt ...
Wert = Mid(Wert, 2) '... erstes Zeichen von Wert abschneiden
Loop
'Teilstring in "L" (Liste) suchen und Ergebnis als 0 oder 1 speichern
Krit1 = Sgn(InStr(L, vbNewline & Mid(Z, P2Start, P2Len) & vbNewline))
Krit2 = 0 'Kriterium Kennung 2 rücksetzen
Else
Block = Block & vbNewline & Z 'Zeile an Block mit Zeilenschaltung anfügen
End If
If Left(Z, KLen) = Kenn2 Then Krit2 = 1 'auf 2. Kriterium ("33") prüfen
'zusätzlichen Teilstring nach einem Leerzeichen an die Zusatzzeile anfügen
If Left(Z, KLen) = Kenn3 Then Zusatz = Mid(Z, P3Start, P3Len) & " " & Right(Nummer, Stellen)
Loop
'letzten Block verarbeiten
If Krit1 * Krit2 = 1 Then 'wenn beide Kriterien erfüllt sind ...
'... Block schreiben und dabei Zusatz-Zeile für Platzhalter (lt Var "Mark") einsetzen ...
A.Write Replace(Block, Mark, vbNewline & Einf & Zusatz)
'Zeile mit Nummer und Wert aus Zeile "Krit1" in Ausgabeliste schreiben
AL.WriteLine Right(Nummer, Stellen) & " " & Wert
Else ' ... ansonsten ...
A.Write Replace(Block, Mark, "") '... Platzhalter vor dem Schreiben rückstandsfrei entfernen
End If
Grüße
bastla
Hallo Calim3ro!
Wie der Inhalt von "Wert" zustande kommt ist egal - nach der Schleife (Zeilen 59 - 61) müssten das/die zu entfernenden Zeichen (Variable "Entf", Zeile 9) jedenfalls weg sein ...
Nur zur Sicherheit: Vorausgesetzt habe ich, dass "Q" ein einzelnes Zeichen, bei dem zwischen Groß- und Kleinschreibung unterschieden wird, ist.
Grüße
bastla
Wie der Inhalt von "Wert" zustande kommt ist egal - nach der Schleife (Zeilen 59 - 61) müssten das/die zu entfernenden Zeichen (Variable "Entf", Zeile 9) jedenfalls weg sein ...
Nur zur Sicherheit: Vorausgesetzt habe ich, dass "Q" ein einzelnes Zeichen, bei dem zwischen Groß- und Kleinschreibung unterschieden wird, ist.
Grüße
bastla