Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

In einem File nach Zeilenblöcken suchen und Zeilen hinzufügen. (CMD, Pearl,VCS)

Frage Entwicklung

Mitglied: Calim3ro

Calim3ro (Level 1) - Jetzt verbinden

04.07.2013, aktualisiert 17.03.2014, 1708 Aufrufe, 24 Kommentare, 4 Danke

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
Mitglied: certifiedit.net
04.07.2013 um 22:57 Uhr
Hallo,

1. Frage: Einmalig, oder nicht?
2., falls ersteres @1: Notepad++?

Grüße
Bitte warten ..
Mitglied: bastla
05.07.2013, aktualisiert um 00:40 Uhr
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 ):
01.
@echo off & setlocal 
02.
set "Ein=D:\Datei.txt" 
03.
set "Aus=D:\Datei_neu.txt" 
04.
 
05.
(for /f "tokens=1* delims=: " %%i in ('findstr /n "^" "%Ein%"') do ( 
06.
    for /f "tokens=1*" %%a in ("%%j") do ( 
07.
        if "%%a"=="11" set "Wert=%%b" 
08.
        if "%%a"=="33" if defined Wert set "Schreiben=true" 
09.
10.
    if "%%j"=="" if defined Schreiben ( 
11.
        setlocal enabledelayedexpansion 
12.
        echo 99 !Wert! 
13.
        endlocal 
14.
        set "Schreiben=" 
15.
        set "Wert=" 
16.
17.
    echo(%%j 
18.
))>"%Aus%" 
19.
if defined Schreiben >>"%Aus%" echo 99 %Wert%
Alternative (setzt keine Leerzeile am Ende des Blocks voraus, erzeugt aber eine im Ergebnis - falls nicht gewünscht, Zeile 14 entfernen):
01.
@echo off & setlocal 
02.
set "Ein=Datei.txt" 
03.
set "Aus=Datei_neu.txt" 
04.
 
05.
(for /f "usebackq delims=" %%i in ("%Ein%") do ( 
06.
    for /f "tokens=1*" %%a in ("%%i") do ( 
07.
        if "%%a"=="11" ( 
08.
            if defined Schreiben ( 
09.
                setlocal enabledelayedexpansion 
10.
                echo 99 !Wert! 
11.
                endlocal 
12.
                set "Schreiben=" 
13.
14.
            if defined Wert echo( 
15.
            set "Wert=%%b" 
16.
17.
        if "%%a"=="33" set "Schreiben=true" 
18.
19.
    echo(%%i 
20.
))>"%Aus%" 
21.
if defined Schreiben >>"%Aus%" echo 99 %Wert%
Grüße
bastla

[Edit] Berücksichtigung des letzten Blocks ergänzt und Alternativvariante hinzugefügt [/Edit]
Bitte warten ..
Mitglied: Calim3ro
05.07.2013 um 19:43 Uhr
Hallo certifiedit

Zur Frage 1: nicht einmalig, bis zum Ende der Datei.

Somit ergibt sich Frage 2.

Gruss Calim3ro
Bitte warten ..
Mitglied: Calim3ro
05.07.2013 um 20:13 Uhr
Hallo bastla

Besten Dank für Deine Bemühungen. Wie immer flott und kompetent unterwegs.

Konnte Deine 2te Version bestens verwenden. (ohne Linie 14, da keine Leerzeile am Ende erwünscht.)

Noch sind ein paar Anpassungen nötig, daher 2 Zusatzfragen:

1. Was muss ich anpassen, damit die neue Zeile nicht ans Ende des Blocks geschrieben wird, sondern unter die Zeile welche mit 11 beginnt?

2. Ist es möglich, die Positionen 10-15 der 11er-Zeile auszuwerten und den Wert mit einer Positivliste (separates File) zu verleichen.
Nur wenn dieser Wert auch in der Positivliste enthalten ist soll die 99-er Zeile ausgegeben werden.

Bei Fragen oder Unklarheiten einfach nachfragen.

Besten Dank im Voraus.

Gruss Calim3ro
Bitte warten ..
Mitglied: bastla
05.07.2013, aktualisiert um 22:04 Uhr
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:
01.
Ein = "D:\Datei.txt" 
02.
Aus = "D:\Datei_neu.txt" 
03.
Liste = "D:\Positivliste.txt" 
04.
 
05.
Kenn = "11" 
06.
Kenn2 = "33" 
07.
Einf = "99" 
08.
PStart = 10 
09.
PEnde = 15 
10.
 
11.
KLen = Len(Kenn) 'Längen der Teilstrings vor der Schleife ... 
12.
PLen = PEnde - PStart + 1 '... und damit nur einmal berechnen 
13.
 
14.
Mark = "§§§" 'Platzhalter für einzufügende Zeile; darf in der zu verarbeitenden Datei nicht enthalten sein 
15.
 
16.
Set fso = CreateObject("Scripting.FileSystemObject") 
17.
Set E = fso.OpenTextFile(Ein) 
18.
Set A = fso.CreateTextFile(Aus) 
19.
 
20.
'Positivliste so in Variable einlesen, dass jeder Eintrag durch eine Zeilenschaltung begrenzt ist 
21.
L = vbNewline & fso.OpenTextFile(Liste).ReadAll & vbNewLine  
22.
 
23.
Do While Not E.AtEndOfStream 
24.
    Z = E.ReadLine 
25.
    If Left(Z, KLen) = Kenn Then 'Blockbeginn? 
26.
        If Krit1 * Krit2 = 1 Then 'wenn beide Kriterien erfüllt sind ... 
27.
            '... Block schreiben und dabei Zusatz-Zeile für Platzhalter (lt Var "Mark") einsetzen ... 
28.
            A.Write Replace(Block, Mark, vbNewline & Einf & Wert) 
29.
        Else ' ... ansonsten ... 
30.
            A.Write Replace(Block, Mark, "") '... Platzhalter vor dem Schreiben rückstandsfrei entfernen 
31.
        End If 
32.
        If Wert <> "" Then 'ab zweitem Block ... 
33.
            '... neuen Block mit Zeilenschaltung (vorhergehender Block endet ohne Zeilenschaltung) beginnen 
34.
            Block = vbNewLine & Z & Mark 
35.
        Else 
36.
            Block = Z & Mark 
37.
        End If 
38.
        Wert = Mid(Z, KLen + 1) 
39.
        'Teilstring in "L" (Liste) suchen und Ergebnis als 0 oder 1 speichern 
40.
        Krit1 = Sgn(InStr(L, vbNewline & Mid(Z, PStart, PLen) & vbNewline)) 
41.
        Krit2 = 0 'Kriterium Kennung 2 rücksetzen 
42.
    Else 
43.
        Block = Block & vbNewline & Z 'Zeile an Block mit Zeilenschaltung anfügen 
44.
    End If 
45.
    If Left(Z, KLen) = Kenn2 Then Krit2 = 1 'auf 2. Kriterium ("33") prüfen 
46.
Loop 
47.
 
48.
'letzten Block verarbeiten 
49.
If Krit1 * Krit2 = 1 Then 'wenn beide Kriterien erfüllt sind ... 
50.
    '... Block schreiben und dabei Zusatz-Zeile für Platzhalter (lt Var "Mark") einsetzen ... 
51.
    A.Write Replace(Block, Mark, vbNewline & Einf & Wert) 
52.
Else ' ... ansonsten ... 
53.
    A.Write Replace(Block, Mark, "") '... Platzhalter vor dem Schreiben rückstandsfrei entfernen 
54.
End If
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
Bitte warten ..
Mitglied: Calim3ro
06.07.2013 um 15:49 Uhr
Hallo bastla

Funktioniert ausgezeichnet! Besten Dank für Deine Hilfe und Bemühungen.

Schönes Wochenende.

Gruss Calim3ro
Bitte warten ..
Mitglied: 76109
07.07.2013, aktualisiert um 16:15 Uhr
Hallo zusammen!

Und zur Ergänzung noch die Kurzform:
01.
Const sFileEin = "E:\Eingabe.txt" 
02.
Const sFileAus = "E:\Ausgabe.txt" 
03.
Const sFileListe = "E:\Liste.txt" 
04.
 
05.
Const iTestPos = 10 
06.
Const iTestLen = 6 
07.
 
08.
Set oFso = CreateObject("Scripting.FileSystemObject") 
09.
     
10.
sTest = vbCrLf & oFso.OpenTextFile(sFileListe).ReadAll 
11.
aText = Split(vbCrLf & oFso.OpenTextFile(sFileEin).ReadAll, vbCrLf & "11") 
12.
     
13.
For i = 1 To UBound(aText) 
14.
    If aText(i) <> "" Then 
15.
        sTarget = "11" & Split(aText(i), vbCrLf)(0) 
16.
        sSearch = vbCrLf & Mid(sTarget, iTestPos, iTestLen) 
17.
         
18.
        If InStr(aText(i), vbCrLf & "33 ") > 0 And InStr(sTest, sSearch) > 0 Then 
19.
            aText(i) = sTarget & vbCrLf & "99" & aText(i) 
20.
        Else 
21.
            aText(i) = "11" & aText(i) 
22.
        End If 
23.
    End If 
24.
Next 
25.
     
26.
oFso.CreateTextFile(sFileAus).Write Mid(Join(aText, vbCrLf), 3)
Gruß Dieter
Bitte warten ..
Mitglied: bastla
07.07.2013 um 17:27 Uhr
Hallo Dieter!
Und zur Ergänzung noch die Kurzform:
Hätte ich eigentlich auch so ähnlich vorgehabt - aber wegen
Ich habe ein grosses File (1,5 GB) mit Zeichenblöcken.
dann doch die hinsichtlich RAM weniger anspruchsvolle Variante gewählt ...

Grüße
bastla
Bitte warten ..
Mitglied: 76109
07.07.2013, aktualisiert 08.07.2013
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:
01.
Const sFileEin = "E:\Eingabe.txt" 
02.
Const sFileAus = "E:\Ausgabe.txt" 
03.
Const sFileListe = "E:\Liste.txt" 
04.
 
05.
Const iFindPos = 10 
06.
Const iFindLen = 6 
07.
 
08.
Set oFso = CreateObject("Scripting.FileSystemObject") 
09.
Set oList = CreateObject("Scripting.Dictionary") 
10.
 
11.
Set oFileEin = oFso.OpenTextFile(sFileEin) 
12.
Set oFileAus = oFso.CreateTextFile(sFileAus) 
13.
 
14.
sComp = vbCrLf & oFso.OpenTextFile(sFileListe).ReadAll 
15.
 
16.
Do Until oFileEin.AtEndOfStream 
17.
    sText = oFileEin.ReadLine 
18.
     
19.
    If Left(sText, 2) = "11" Then 
20.
        oList.Add "11", sText 
21.
        oList.Add "99", "99" & Mid(sText, 3) 
22.
    ElseIf sText <> "" Then 
23.
        oList.Add Left(sText, 2), sText 
24.
    End If 
25.
     
26.
    If sText = "" Or oFileEin.AtEndOfStream = True Then 
27.
        If oList.Exists("11") Then 
28.
            sFind = vbCrLf & Mid(oList.Item("11"), iFindPos, iFindLen) 
29.
            If oList.Exists("33") = False Or InStr(sComp, sFind) < 1 Then 
30.
                oList.Remove "99" 
31.
            End If 
32.
        End If 
33.
        If oFileEin.AtEndOfStream Then sFreeLine = "" Else sFreeLine = vbCrLf 
34.
        oFileAus.Write Join(oList.Items, vbCrLf) & vbCrLf & sFreeLine 
35.
        oList.RemoveAll 
36.
    End If 
37.
Loop 
38.
 
39.
oFileEin.Close:  oFileAus.Close
[/edit]
Bitte warten ..
Mitglied: Calim3ro
14.07.2013 um 17:14 Uhr
Guten Tag zusammen

Hallo bastla

Zum VB-Skript von bastla am 05.07.2013 um 22:04 Uhr habe ich noch 2 Fragen.

Erstens:

Ist es möglich, die Dateien "Ein", "Aus" und "Positivliste" beim Aufruf von VB-Skript in cmd mitzugeben?

Ungefähr so:

call Script.vbs -D:\Datei.txt -D:\Datei_Neu.txt -D:\Positivliste.txt

Zweitens:

Wenn im Block die Kritik 1 und 2 (Zeile 11 & 33 im Beispiel) erfüllt wurden und die Zeile 99 geschrieben wird, sollte aus der Zeile 44 (ist im jedem Block enthalten) die Information der Position 5-9 hinter die Zeile 99 eingefügt werden.

Das würde demzufolgen so aussehen:

11 AAAAAAA
22 BBBBBBB
33 CCCCCCC
44 DDDDDDD
55 EEEEEEE
99 AAAAAAA DDDD (<---- geschriebene Information aus Zeile 11 und 44, wenn positiv auf Liste.txt in der Zeile 33)

Bei Unklarheiten einfach nachfragen.

Besten Dank für eure Hilfe und Bemühungen.

Gruss Calim3ro
Bitte warten ..
Mitglied: 76109
14.07.2013, aktualisiert um 20:06 Uhr
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:
01.
With WScript.Arguments 
02.
    If .Count <> 3 Then 
03.
        WScript.Echo "Falsche Anzahl an Argumenten!":  WScript.Quit 1 
04.
    Else 
05.
        Ein = .Item(0):  Aus = .Item(1):  Liste = .Item(2) 
06.
    End If 
07.
End With 
08.
 
09.
Set fso = CreateObject("Scripting.FileSystemObject") 
10.
 
11.
If Not fso.FileExists(Ein) Or Not fso.FileExists(Aus) Or Not fso.FileExists(Liste) Then 
12.
    WScript.Echo "Datei nicht gefunden!":  WScript.Quit 1 
13.
End If
Und im Cmd-Script in etwa so:
01.
@echo off & setlocal 
02.
 
03.
set "VbsScript=C:\Tools\Mein Script.vbs" 
04.
set "DateiEin=C:\Mein Verzeichnis\Eingabe.txt" 
05.
set "DateiAus=C:\Mein Verzeichnis\Ausgabe.txt" 
06.
set "DateiListe=C:\Mein Verzeichnis\Liste.txt" 
07.
 
08.
CScript //nologo "%VbsScript%" "%DateiEin%" "%DateiAus%" "%DateiListe%"
Gruß Dieter
Bitte warten ..
Mitglied: bastla
14.07.2013, aktualisiert um 20:35 Uhr
Hallo Calim3ro und Dieter!

Die angepasste (aber völlig ungetestete) Version des Scripts könnte dann so aussehen:
01.
Kenn =    "11" 
02.
Kenn2 =   "33" 
03.
P2Start = 10 
04.
P2Ende =  15 
05.
Kenn3 =   "44" 
06.
P3Start = 5 
07.
P3Ende =  9 
08.
Einf =    "99" 
09.
 
10.
With WScript.Arguments 
11.
    If .Count <> 3 Then 
12.
        WScript.Echo "Falsche Anzahl an Argumenten!" 
13.
        WScript.Quit 1 
14.
    Else 
15.
        Ein =   .Item(0) 
16.
        Aus =   .Item(1) 
17.
        Liste = .Item(2) 
18.
    End If 
19.
End With 
20.
 
21.
KLen = Len(Kenn) 'Längen der Teilstrings vor der Schleife ... 
22.
P2Len = P2Ende - P2Start + 1 '... 
23.
P3Len = P3Ende - P3Start + 1 '... und damit nur einmal berechnen 
24.
 
25.
Mark = "§§§" 'Platzhalter für einzufügende Zeile; darf in der zu verarbeitenden Datei nicht enthalten sein 
26.
 
27.
Set fso = CreateObject("Scripting.FileSystemObject") 
28.
Set E = fso.OpenTextFile(Ein) 
29.
Set A = fso.CreateTextFile(Aus) 
30.
 
31.
'Positivliste so in Variable einlesen, dass jeder Eintrag durch eine Zeilenschaltung begrenzt ist 
32.
L = vbNewline & fso.OpenTextFile(Liste).ReadAll & vbNewLine  
33.
 
34.
Do While Not E.AtEndOfStream 
35.
    Z = E.ReadLine 
36.
    If Left(Z, KLen) = Kenn Then 'Blockbeginn? 
37.
        If Krit1 * Krit2 = 1 Then 'wenn beide Kriterien erfüllt sind ... 
38.
            '... Block schreiben und dabei Zusatz-Zeile für Platzhalter (lt Var "Mark") einsetzen ... 
39.
            A.Write Replace(Block, Mark, vbNewline & Einf & Wert) 
40.
        Else ' ... ansonsten ... 
41.
            A.Write Replace(Block, Mark, "") '... Platzhalter vor dem Schreiben rückstandsfrei entfernen 
42.
        End If 
43.
        If Wert <> "" Then 'ab zweitem Block ... 
44.
            '... neuen Block mit Zeilenschaltung (vorhergehender Block endet ohne Zeilenschaltung) beginnen 
45.
            Block = vbNewLine & Z & Mark 
46.
        Else 
47.
            Block = Z & Mark 
48.
        End If 
49.
        Wert = Mid(Z, KLen + 1) 
50.
        'Teilstring in "L" (Liste) suchen und Ergebnis als 0 oder 1 speichern 
51.
        Krit1 = Sgn(InStr(L, vbNewline & Mid(Z, P2Start, P2Len) & vbNewline)) 
52.
        Krit2 = 0 'Kriterium Kennung 2 rücksetzen 
53.
    Else 
54.
        Block = Block & vbNewline & Z 'Zeile an Block mit Zeilenschaltung anfügen 
55.
    End If 
56.
    If Left(Z, KLen) = Kenn2 Then Krit2 = 1 'auf 2. Kriterium ("33") prüfen 
57.
    'zusätzlichen Teilstring nach einem Leerzeichen an die Zusatzzeile anfügen 
58.
    If Left(Z, KLen) = Kenn3 Then Wert = Wert & " " & Mid(Z, P3Start, P3Len) 
59.
Loop 
60.
 
61.
'letzten Block verarbeiten 
62.
If Krit1 * Krit2 = 1 Then 'wenn beide Kriterien erfüllt sind ... 
63.
    '... Block schreiben und dabei Zusatz-Zeile für Platzhalter (lt Var "Mark") einsetzen ... 
64.
    A.Write Replace(Block, Mark, vbNewline & Einf & Wert) 
65.
Else ' ... ansonsten ... 
66.
    A.Write Replace(Block, Mark, "") '... Platzhalter vor dem Schreiben rückstandsfrei entfernen 
67.
End If
Grüße
bastla
Bitte warten ..
Mitglied: Calim3ro
15.07.2013 um 00:08 Uhr
Hallo Dieter

Der Aufruf des VB-Skripts via cmd läuft super.

Besten Dank dafür.

Hallo bastla

Hmm, irgendwie werden die Information aus der 44er-Zeile Position 5-9 nicht hinter die 99er-Zeile mit der Information aus der 11er-Zeile geschrieben.

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...

Falls ja, wie kann dies umgangen werden? Benötige aus der 11er-Zeile die Information der Positionen 3-6, welche hinter die 99er-Zeile geschriben wird. Dahinter die Information Position 5-9 der 44er-Zeile.

Falls zu kompliziert erklärt, kann ich auch eine Zeichnung erstellen.

Gruss Calim3ro
Bitte warten ..
Mitglied: 76109
15.07.2013, aktualisiert um 01:07 Uhr
Hallo Calim3ro!

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
Bitte warten ..
Mitglied: Calim3ro
15.07.2013 um 22:09 Uhr
Hallo Dieter & bastla

Besten Dank für deine Anmerkung.
Die 6 Zeichen sind auch richtig. War schon etwas spät gestern, deswegen habe ich ein bischen den Durchblick verloren.
Aber nun klappt alles! Falls es noch weitere Anpassungen geben sollte, darf ich mich sicher nochmals an euch wenden.

Eine schöne Woche wünsch ich euch.

Gruss Calim3ro
Bitte warten ..
Mitglied: Calim3ro
14.08.2013 um 13:55 Uhr
Hallo zusammen

Hallo bastla

Ich mal wieder mit einem Anliegen zu diesem Skript.
Erst mal vorneweg, dieser funktioniert super, besten Dank nochmal.
Nun hat sich jedoch einiges geändert, was gewisse Anpassungen am Skript erforder und ich wieder auf Eure Hilfe angewiesen bin.

Wie muss dieses Skript angepasst werden, um die Information wie folgt zu verarbeiten:

Stand bisher:

11 AAAAAAA
22 BBBBBBB
33 CCCCCCC
44 DDDDDDD
55 EEEEEEE
99 AAAAAAA DDDD

Stand neu:

11 AAAAAAA
22 BBBBBBB
33 CCCCCCC
44 DDDDDDD
55 EEEEEEE
99 DDDD 050000 <----- Fortlaufende Nummer, welche bei 50'000 beginnt
11 AAAAAAA
22 BBBBBBB
33 CCCCCCC
44 DDDDDDD
55 EEEEEEE
99 DDDD 050001 <----- Fortlaufende Nummer

Information AAAAAAA soll in ein neu erstelltes File geschrieben werden, bei welcher die fortlaufende Nummer vorneweg steht:

050000 AAAAAAA
050001 AAAAAAB
etc...

Die fortlaufende Nummer wird nie über 999999 hinausgehen....

Besten Dank für Eure Bemühungen schonmal im Voraus.

Bei Unklarheiten bitte nachfragen.

Gruss Calim3ro
Bitte warten ..
Mitglied: bastla
15.08.2013 um 21:14 Uhr
Hallo Calim3ro!

Ich hoffe, Dich richtig verstanden zu haben - falls ja, könnte das so gehen (wie immer ungetestet ):
01.
Kenn =    "11" 
02.
Kenn2 =   "33" 
03.
P2Start = 10 
04.
P2Ende =  15 
05.
Kenn3 =   "44" 
06.
P3Start = 5 
07.
P3Ende =  9 
08.
Einf =    "99" 
09.
NStart = 50000 
10.
Stellen = 6 
11.
 
12.
With WScript.Arguments 
13.
    If .Count <> 4 Then 
14.
        WScript.Echo "Falsche Anzahl an Argumenten!" 
15.
        WScript.Quit 1 
16.
    Else 
17.
        Ein =    .Item(0) 
18.
        Aus =    .Item(1) 
19.
        Liste =  .Item(2) 
20.
        AListe = .Item(3) 
21.
    End If 
22.
End With 
23.
 
24.
Nummer = 10 ^ Stellen + NStart 'Startwert (um eine Zehnerpotenz größer als lt "Stellen" wegen der führenden Nullen) erzeugen 
25.
KLen = Len(Kenn) 'Längen der Teilstrings vor der Schleife ... 
26.
P2Len = P2Ende - P2Start + 1 '... 
27.
P3Len = P3Ende - P3Start + 1 '... und damit nur einmal berechnen 
28.
 
29.
Mark = "§§§" 'Platzhalter für einzufügende Zeile; darf in der zu verarbeitenden Datei nicht enthalten sein 
30.
 
31.
Set fso = CreateObject("Scripting.FileSystemObject") 
32.
Set E = fso.OpenTextFile(Ein) 
33.
Set A = fso.CreateTextFile(Aus) 
34.
Set AL = fso.CreateTextFile(AListe) 
35.
 
36.
'Positivliste so in Variable einlesen, dass jeder Eintrag durch eine Zeilenschaltung begrenzt ist 
37.
L = vbNewline & fso.OpenTextFile(Liste).ReadAll & vbNewLine  
38.
 
39.
Do While Not E.AtEndOfStream 
40.
    Z = E.ReadLine 
41.
    If Left(Z, KLen) = Kenn Then 'Blockbeginn? 
42.
        If Krit1 * Krit2 = 1 Then 'wenn beide Kriterien erfüllt sind ... 
43.
            '... Block schreiben und dabei Zusatz-Zeile für Platzhalter (lt Var "Mark") einsetzen ... 
44.
            A.Write Replace(Block, Mark, vbNewline & Einf & Zusatz) 
45.
            'Zeile mit Nummer und Wert aus Zeile "Krit1" in Ausgabeliste schreiben 
46.
            AL.WriteLine Right(Nummer, Stellen) & " " & Wert  
47.
            Nummer = Nummer + 1 'Nummer weiterzählen 
48.
        Else ' ... ansonsten ... 
49.
            A.Write Replace(Block, Mark, "") '... Platzhalter vor dem Schreiben rückstandsfrei entfernen 
50.
        End If 
51.
        If Wert <> "" Then 'ab zweitem Block ... 
52.
            '... neuen Block mit Zeilenschaltung (vorhergehender Block endet ohne Zeilenschaltung) beginnen 
53.
            Block = vbNewLine & Z & Mark 
54.
        Else 
55.
            Block = Z & Mark 
56.
        End If 
57.
        Wert = Mid(Z, KLen + 1) 
58.
        'Teilstring in "L" (Liste) suchen und Ergebnis als 0 oder 1 speichern 
59.
        Krit1 = Sgn(InStr(L, vbNewline & Mid(Z, P2Start, P2Len) & vbNewline)) 
60.
        Krit2 = 0 'Kriterium Kennung 2 rücksetzen 
61.
    Else 
62.
        Block = Block & vbNewline & Z 'Zeile an Block mit Zeilenschaltung anfügen 
63.
    End If 
64.
    If Left(Z, KLen) = Kenn2 Then Krit2 = 1 'auf 2. Kriterium ("33") prüfen 
65.
    'zusätzlichen Teilstring nach einem Leerzeichen an die Zusatzzeile anfügen 
66.
    If Left(Z, KLen) = Kenn3 Then Zusatz = Mid(Z, P3Start, P3Len) & " " & Right(Nummer, Stellen) 
67.
Loop 
68.
 
69.
'letzten Block verarbeiten 
70.
If Krit1 * Krit2 = 1 Then 'wenn beide Kriterien erfüllt sind ... 
71.
    '... Block schreiben und dabei Zusatz-Zeile für Platzhalter (lt Var "Mark") einsetzen ... 
72.
    A.Write Replace(Block, Mark, vbNewline & Einf & Zusatz) 
73.
    'Zeile mit Nummer und Wert aus Zeile "Krit1" in Ausgabeliste schreiben 
74.
    AL.WriteLine Right(Nummer, Stellen) & " " & Wert  
75.
Else ' ... ansonsten ... 
76.
    A.Write Replace(Block, Mark, "") '... Platzhalter vor dem Schreiben rückstandsfrei entfernen 
77.
End If
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
Bitte warten ..
Mitglied: Calim3ro
17.08.2013 um 11:32 Uhr
Hallo bastla

Besten Dank für Deine schnelle Antwort und Bemühung.

Natürlich wie immer ungetestet und wie immer funktionierts (nach ein paar kleinen Anpassungen) ausgezeichnet!

Gruss Calim3ro
Bitte warten ..
Mitglied: Calim3ro
14.03.2014 um 18:39 Uhr
Hallo zusammen

Hallo bastla

Es gibt wieder mal eine kleine Anpassung an diesem Script und ich hoffe, ihr könnt mir weiterhelfen.

Der String, welcher in die neue Datei geschrieben wird, sollte von einem vorhergehenden Zeichen (Q) befreit werden.

Stand bisher:

050000 QQQAAAA
050001 QQAAQAB

Stand neu:

050000 AAAA
050001 AAQAB

Es können also auch Q's im benötigten Teil vorkommen, welche erhalten bleiben müssen. Nur die führenden Q's sollten gelöscht werden.

Wie würde die Anpassung im obrigen Script aussehen?

Besten Dank für eure Bemühungen.

Bei Unklarheiten einfach nachfragen...

Es grüsst Calim3ro
Bitte warten ..
Mitglied: bastla
LÖSUNG 14.03.2014, aktualisiert 17.03.2014
Hallo Calim3ro!

Einmal mehr ohne Test meinerseits:
01.
Kenn =    "11" 
02.
Kenn2 =   "33" 
03.
P2Start = 10 
04.
P2Ende =  15 
05.
Kenn3 =   "44" 
06.
P3Start = 5 
07.
P3Ende =  9 
08.
Einf =    "99" 
09.
Entf = "Q" 'zu entfernendes Zeichen am Beginn des Wertes für die Ausgabeliste 
10.
NStart = 50000 
11.
Stellen = 6 
12.
 
13.
With WScript.Arguments 
14.
    If .Count <> 4 Then 
15.
        WScript.Echo "Falsche Anzahl an Argumenten!" 
16.
        WScript.Quit 1 
17.
    Else 
18.
        Ein =    .Item(0) 
19.
        Aus =    .Item(1) 
20.
        Liste =  .Item(2) 
21.
        AListe = .Item(3) 
22.
    End If 
23.
End With 
24.
 
25.
Nummer = 10 ^ Stellen + NStart 'Startwert (um eine Zehnerpotenz größer als lt "Stellen" wegen der führenden Nullen) erzeugen 
26.
KLen = Len(Kenn) 'Längen der Teilstrings vor der Schleife ... 
27.
P2Len = P2Ende - P2Start + 1 '... 
28.
P3Len = P3Ende - P3Start + 1 '... und damit nur einmal berechnen 
29.
 
30.
Mark = "§§§" 'Platzhalter für einzufügende Zeile; darf in der zu verarbeitenden Datei nicht enthalten sein 
31.
 
32.
Set fso = CreateObject("Scripting.FileSystemObject") 
33.
Set E = fso.OpenTextFile(Ein) 
34.
Set A = fso.CreateTextFile(Aus) 
35.
Set AL = fso.CreateTextFile(AListe) 
36.
 
37.
'Positivliste so in Variable einlesen, dass jeder Eintrag durch eine Zeilenschaltung begrenzt ist 
38.
L = vbNewline & fso.OpenTextFile(Liste).ReadAll & vbNewLine  
39.
 
40.
Do While Not E.AtEndOfStream 
41.
    Z = E.ReadLine 
42.
    If Left(Z, KLen) = Kenn Then 'Blockbeginn? 
43.
        If Krit1 * Krit2 = 1 Then 'wenn beide Kriterien erfüllt sind ... 
44.
            '... Block schreiben und dabei Zusatz-Zeile für Platzhalter (lt Var "Mark") einsetzen ... 
45.
            A.Write Replace(Block, Mark, vbNewline & Einf & Zusatz) 
46.
            'Zeile mit Nummer und Wert aus Zeile "Krit1" in Ausgabeliste schreiben 
47.
            AL.WriteLine Right(Nummer, Stellen) & " " & Wert  
48.
            Nummer = Nummer + 1 'Nummer weiterzählen 
49.
        Else ' ... ansonsten ... 
50.
            A.Write Replace(Block, Mark, "") '... Platzhalter vor dem Schreiben rückstandsfrei entfernen 
51.
        End If 
52.
        If Wert <> "" Then 'ab zweitem Block ... 
53.
            '... neuen Block mit Zeilenschaltung (vorhergehender Block endet ohne Zeilenschaltung) beginnen 
54.
            Block = vbNewLine & Z & Mark 
55.
        Else 
56.
            Block = Z & Mark 
57.
        End If 
58.
        Wert = Mid(Z, KLen + 1) 'Wert auslesen 
59.
        Do While Left(Wert, 1) = Entf 'Solange Wert mit Zeichen lt "Entf" beginnt ... 
60.
            Wert = Mid(Wert, 2) '... erstes Zeichen von Wert abschneiden 
61.
        Loop 
62.
        'Teilstring in "L" (Liste) suchen und Ergebnis als 0 oder 1 speichern 
63.
        Krit1 = Sgn(InStr(L, vbNewline & Mid(Z, P2Start, P2Len) & vbNewline)) 
64.
        Krit2 = 0 'Kriterium Kennung 2 rücksetzen 
65.
    Else 
66.
        Block = Block & vbNewline & Z 'Zeile an Block mit Zeilenschaltung anfügen 
67.
    End If 
68.
    If Left(Z, KLen) = Kenn2 Then Krit2 = 1 'auf 2. Kriterium ("33") prüfen 
69.
    'zusätzlichen Teilstring nach einem Leerzeichen an die Zusatzzeile anfügen 
70.
    If Left(Z, KLen) = Kenn3 Then Zusatz = Mid(Z, P3Start, P3Len) & " " & Right(Nummer, Stellen) 
71.
Loop 
72.
 
73.
'letzten Block verarbeiten 
74.
If Krit1 * Krit2 = 1 Then 'wenn beide Kriterien erfüllt sind ... 
75.
    '... Block schreiben und dabei Zusatz-Zeile für Platzhalter (lt Var "Mark") einsetzen ... 
76.
    A.Write Replace(Block, Mark, vbNewline & Einf & Zusatz) 
77.
    'Zeile mit Nummer und Wert aus Zeile "Krit1" in Ausgabeliste schreiben 
78.
    AL.WriteLine Right(Nummer, Stellen) & " " & Wert  
79.
Else ' ... ansonsten ... 
80.
    A.Write Replace(Block, Mark, "") '... Platzhalter vor dem Schreiben rückstandsfrei entfernen 
81.
End If
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
Bitte warten ..
Mitglied: Calim3ro
17.03.2014 um 12:33 Uhr
Hallo bastla

Danke für Deine Rückmeldung.

Ich habe die Anpassungen gemäss deiner Vorlage in mein Script kopiert, jedoch wird der String "Wert" immen noch mit führenden "Q" ausgegeben...

Kann das daran liegen, dass ich den Wert nicht wie in deinem Script nicht mit Wert = Mid(Z, KLen + 1) definier habe, sondern mit Wert = Mid(Z, 3, 6) ?

Falls dies zu kompliziert ist (oder ich zu blöde) können die führenden "Q's" auch mit einem zweiten Script aus dem File entfernt werden. Der zu kürzende Wert befindet sich an der Position 9-13. Wie würde ein solcher Aussehen?

Besten Dank für Deine Hilfe.

Gruss Calimero
Bitte warten ..
Mitglied: bastla
LÖSUNG 17.03.2014, aktualisiert um 22:28 Uhr
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
Bitte warten ..
Mitglied: Calim3ro
17.03.2014 um 22:28 Uhr
Hallo bastla!

Habe beim meinem Script den Fehler gefunden und behoben.( bei Mid(Z, 3, 6) war 3 ein Leerzeichen....)

Nun tuts genau das, was ich wollte.

Besten Dank für deine Bemühungen!

Gruss Calimero
Bitte warten ..
Mitglied: Calim3ro
07.06.2014 um 14:43 Uhr
Hallo zusammen

Gerne würde ich (wieder einmal) eine Anpassung an diesem Skript machen.
Es sollen pro "Zeilenblock" die erste und letzte Zeile, welche auf Pos 1-7 ein numerischen Wert haben, anstelle von P3Start, P3Len geschrieben werden. Die Abfrage von Kenn3 gelöscht werden.

11 AAAAAAA
22 BBBBBBB
33 CCCCCCC
44 DDDDDDD
55 EEEEEEE
99 DDDD 050000
1234567 ----> Wert1
0000000
9876543 ----> Wert2
11 AAAAAAA
22 BBBBBBB
33 CCCCCCC
44 DDDDDDD
55 EEEEEEE
3456789 ----> Wert1
11111111
2222222
7654321 ----> Wert2
99 DDDD 050001

In diesem Beispiel muss der Wert1 und Wert2 übernommen werden, da diese die erste und letzte Zeile mit numerischen Werten im "Zeilenblock" sind.

Wie müsste die Anpassung am obrigen Skript aussehen?

Besten Dank für eure Hile im Voraus.

Grüsse Calimero
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
CMD cURL Access Token parsen (2)

Frage von maddig zum Thema Batch & Shell ...

Batch & Shell
gelöst Powershell - In Textdatei suchen und ersetzen (5)

Frage von Raaja89 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (34)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...