tekken
Goto Top

Textdatei Zeilenumbruch bei Sonderzeichen, danach Sonderzeichen löschen und bestimmte Zeilen löschen die mit einem Wert beginnen

Hallo zusammen,

habe mal wieder ein kleines Problem und hoffe auf eure Hilfe:

Ich habe eine Textdatei, die wie folgt ausschaut (Beispiel):

123, 456789,01/02/03;25,1,27
123, 4512313789,01/02/03;25,1,27
123, 456124,01/02/03;25,1,27
123, 45645489,01/02/03;25,1,27
123, 456454589,01/02/03;25,1,27
131;231145;01/11/166;96,00;1;198@21;23076;0111/611;12,0;72
933, 34241 123132 ,13213131
933, 34241 123132 ,13213131
933, 34241 123132 ,13213131

Das @ Zeichen wurde eingefügt, um zu erkennen, wo ein Zeilenumbruch eingefügt werden soll.
Außerdem sollen die Zeilen, welche mit 933 beginnen vollständig gelöscht werden.

Der Text soll dann am Ende so aussehen:

123, 456789,01/02/03;25,1,27
123, 4512313789,01/02/03;25,1,27
123, 456124,01/02/03;25,1,27
123, 45645489,01/02/03;25,1,27
123, 456454589,01/02/03;25,1,27
131;231145;01/11/166;96,00;1;198
21;23076;0111/611;12,0;72


Also folgende 3 Punkte:

1. Nach einem @ soll ein Zeilenumbruch eingefügt werden
2. Das @ soll gelöscht werden
3. Alle Zeilen mit dem Inhalt beginnend 933 sollen gelöscht werden.

Ich hoffe ihr könnt mir helfen.

LG tekken

Content-ID: 177752

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

Ausgedruckt am: 15.11.2024 um 19:11 Uhr

TsukiSan
TsukiSan 15.12.2011, aktualisiert am 18.10.2012 um 18:49:22 Uhr
Goto Top
Hallo tekken,

hast du denn keine Anfangsideen?
Hier könntest du bastlas Ansatz nehmen, um die Zeilen zu löschen (bzw. nicht mitzuschreiben) die mit was-auch-immer anfangen.
Und zu deinem 1ten und auch 2ten Punkt kannst du das mal etwas durchackern von bastla.

Wenn dann noch Fragen sind, hilft der Weihnachtsmann face-wink

Gruss
Tsuki
tekken
tekken 15.12.2011 um 13:41:57 Uhr
Goto Top
Hi Tsuku,

doch ich habe ein paar Ideen und Vorschläge getestet:

@echo off
SETLOCAL enabledelayedexpansion

SET "datei="
SET "ausgabe="
SET "suchzeichen=@"
SET "ersetzungszeichen="

REM Loeschen der Ausgabedatei, falls sie (noch) existiert
IF EXIST %ausgabe% (DEL /f %ausgabe% 1>NUL 2>NUL)

REM Datei zeilenweise auslesen
REM und in Variable "zeile" schreiben
FOR /f "delims=" %%i IN ('FINDSTR . "%datei%"') DO (
SET zeile=%%i& CALL :ersetzen !zeile!
)
GOTO :eof

:ersetzen
REM Das Suchzeichen mit dem Ersetzungszeichen tauschen
SET zeile=!zeile:%suchzeichen%=%ersetzungszeichen%!

REM Ergebnis in die Ausgabedatei schreiben
ECHO !zeile!>>%ausgabe%
GOTO :eof

:eof

Das funktioniert auch recht gut, nur kann ich nur ein Leerzeichen einfügen.
Vllt kann mir noch jemand helfen, gerne auch der Weihnachtsmann.

Gruß tekken
Skyemugen
Skyemugen 15.12.2011 um 13:49:59 Uhr
Goto Top
Aloha,

versuche es doch einmal hiermit:

@echo off & setlocal
(for /f "tokens=1,* delims=@" %%s in ('findstr /v /B "933," "E:\Skripte\test.txt"') do (  
	echo %%s
	set "end=%%t"  
	if defined end echo %%t
))>%temp%\neu.txt
pause
goto :eof

greetz André

P.S.: unsere schöne Codeformatierung ist
edit:
Zitat von @TsukiSan:
[Edit]
Skye ist ja auch schon zur Hilfe herbeigeeilt face-wink
[/Edit]

Ich fühle mich ohne e immer so leicht wie eine Feder an den einen Asterix-Film denken muss
TsukiSan
TsukiSan 15.12.2011 um 13:54:38 Uhr
Goto Top
Nun gut, du hast dich für Batch entschieden. Das geht auf jeden Fall auch!
Ich allerdings würde es in VBS machen (ist Geschmackssache!)
Um mal mit bastlas Beispiel anzufangen und zu es zurecht zuschneidern:
Zum Zeilen weglöschen kannst du das hier nehmen und auch gleich noch ersetzen (replacen):
Set fso = CreateObject("Scripting.FileSystemObject")  
DateiEin = "D:\Datei.txt"  
DateiAus = "D:\Datei_neu.txt"  
T = Split(fso.OpenTextFile(DateiEin).ReadAll, vbCrLF)
Set Ausgabe = fso.CreateTextFile(DateiAus, True)
For Each Z In T
   Z = replace(Z, "@",  vbcrlf)  
   If Left(Z, 3) <> "933" Then Ausgabe.WriteLine Z  
Next
Ausgabe.Close

Du musst noch den Pfad und Dateinamen anpassen und das ganze mal Testen (habe ich jetzt nicht gemacht).
Im Prinzip is das die Skizze in VBS

Gruss vom Weihnachtsmann face-wink

[Edit]
Skye ist ja auch schon zur Hilfe herbeigeeilt face-wink
[/Edit]
tekken
tekken 15.12.2011 um 13:57:02 Uhr
Goto Top
Habs mit [Code][/CODE] probiert hat natürlich nicht geklappt :P Danke für deine Hilfe, funktioniert perfekt.
Wünsche allen Helfern frohe Weihnachten =)

Gruß tekken
TsukiSan
TsukiSan 15.12.2011 um 13:59:24 Uhr
Goto Top
Das böse böse e face-sad
Das hat mir diese Woche an anderer Stelle schon mal einen Streich gespielt face-wink

hab's geändert!

Gruss
Tsuki
tekken
tekken 15.12.2011 um 14:07:31 Uhr
Goto Top
Hi ihr beiden,

geht doch noch nicht ganz^^
Habe das Problem, dass mehrere @ in einer Zeile vorhanden sind und er jeweils nur 1 Umbruch macht.
Müsste mann dann nochmal ne Schleife machen?

Gruß tekken
Skyemugen
Skyemugen 15.12.2011 um 14:14:17 Uhr
Goto Top
Aloha,

ganz ehrlich: man könnte jetzt nach einem unserer Tutorials mit einer FOR F mit einer variabelen Anzahl Tokens an Laufvariablen/Tokens arbeiten und die Schleife weiterstricken ... oder Unterschleifen/-programme entwerfen ...

oder du nimmst TsukiSans VBScript, das auch für deinen erweiterten Fall seine Arbeit ordnungsgemäß verrichtet face-wink

greetz André

P.S.: ... kommt davon, wenn man nicht den vollen Umfang in den EP packt ^__^
tekken
tekken 15.12.2011 um 14:27:08 Uhr
Goto Top
Danke für die Antwort.

Habs mal mit TsukiSans VBScript probiert und klappt fast alles hervorragend. Nur das Löschen der Zeilen mit 933 beginnend funktioniert nicht.

Die Zeile schaut bei mir so aus: If Left(Z, 3) <> "21;9" Then Ausgabe.WriteLine Z

Musste die Variable anpassen.

Ja da war ich wohl selber schuld =)

Wär toll wenn ihr mir da noch nen Tipp geben könntet.

Aufjedenfall schonmal vielen Dank.
Skyemugen
Skyemugen 15.12.2011 um 14:33:22 Uhr
Goto Top
Aloha,

hm? Tut mir leid, kann ich nicht nachvollziehen, das VBS tut genau seinen Dienst

If Left(Z, 3) <> "933" Then Ausgabe.WriteLine Z muss schon so bleiben, schließlich werden dort die ersten drei Zeichen einer Zeile von links nur zum Ausgeben deklariert, wenn diese UNGLEICH 933 sind.

greetz André
tekken
tekken 15.12.2011 um 14:36:47 Uhr
Goto Top
Ah ok dann hab ichs verstanden.

Hab es so angepasst und funktioniert:

If Left(Z, 4) <> "933" Then Ausgabe.WriteLine Z

DANKE DANKE DANKE