dave114
Goto Top

Einträge per Batch aus Datei löschen

morgen allerseits,

Ich habe hier eine Datei die mehr als 4000 SMTPRoutes enthält.

Formatbeispiele:
Domain:IP
Domain:Hostname
.Domain:Hostname

Zwischen drin sind allerdings auch immer wieder Kommentare.

Formatbeispiel:
#Domain:Hostname
#(Lehrzeichen)bla bla

Ich würde gerne die Datei per Batch so bearbeiten (oder neu erstellen) das er mir alle Sachen die hinter dem Domainnamen stehen (also alles andere in der Zeile inklusive den : ) rauswirft oder die Sachen vor dem : in eine neue Datei schreibt.
Zusätzlich sollen auch die Kommentare (die jeweils mit einem # beginnen) entfert werden.

Da das ganz voraussichtlich jeden Monat neu gemacht werden muss will ich es niemanden zumuten das jedes Mal von Hand zu machen.

Ich würde mich über eure Hilfe freuen.

mfg
David


/edit:

Beispiele:

Ursprungsdatei:

archaeologie-xxx.de:15.62.xxx.xxx
landesmuseum-xxx.de:10.18.xxx.xxx
# Mai 2005
museum-xxx.de:10.30.xxx.xxx
# land-xxx.de 2009013001


Datei nach bearbeitung:

archaeologie-xxx.de
landesmuseum-xxx.de
museum-xxx.de

Content-Key: 144014

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

Printed on: April 16, 2024 at 04:04 o'clock

Member: Edi.Pfisterer
Edi.Pfisterer Jun 02, 2010 at 09:15:24 (UTC)
Goto Top
Hallo!
Poste mal ein paar Zeilen aus Deiner Datei + wie die Datei danach aussehen sollte, dann können wir uns das ganze etwas leichter vorstellen und werden sicher eine Lösung finden...

lg
Member: Edi.Pfisterer
Edi.Pfisterer Jun 02, 2010 at 09:44:13 (UTC)
Goto Top
Hallo!
Versuch mal folgendes - ist zwar kein batch, aber sollte auch das machen, was Du willst:
(ist ungetestet, bitte zuerst an einer Sicherungskopie deiner Datei ausprobieren...)

Speichern unter *umbau.vbs*
datei= "lindenbaum.txt"  

Set fs = CreateObject("Scripting.FileSystemObject")  

Set File = fs.OpenTextFile(datei , 1, true)
        Do While not file.AtEndOfStream
                           zeile = (file.ReadLine)
                            doppelpunkt = instr(zeile,":")  
                            if doppelpunkt >= 1 then
                               zeile = left(zeile, doppelpunkt-1) & vbCrLf
                            end if

                            raute = instr(zeile,"#")  
                            if raute >= 1 then
                               zeile = ""  
                            end if

                         inhaltneu = inhaltneu & zeile
        Loop

Set File = nothing

set dateineu = fs.createtextfile(datei, true)
dateineu.write  inhaltneu
Set dateineu = nothing

Hoffe, das hilft Dir weiter
lg
Member: dave114
dave114 Jun 02, 2010 at 09:52:52 (UTC)
Goto Top
Respekt Edi

Läuft einwandfrei.

Das einzige was du mir noch verraten könntest wäre wie ich noch die Leerzeilen die durch das rauslöschen der Kommentare entstehen aus der Datei rausbekomme.

Vielen Dank.

David

/edit

und wenn du grad sonst nichts zu tun hast würde ich mich freuen wenn du den Quellcode ein wenig kommentieren würdest - ich bin nicht so die Leuchte in vbs face-wink.
Member: Edi.Pfisterer
Edi.Pfisterer Jun 02, 2010 at 10:25:21 (UTC)
Goto Top
Hallo!
Hab den "Fehler" bereits oben im Code ausgessert, bitte nochmal testen - Leerzeilen sollten nun keine mehr entstehen...

Zur kurzen Erklärung (muss wieder in den Unterricht zurück - es fällt relativ schnell auf, wenn der Lehrer weg ist face-wink

instr(WoWirdGesucht, WasWirdGesucht) liefert die Stelle, an der das gesuchte Zeichen/die Zeichenkette zum ersten mal vorkommt.
ergo: wenn 0, dann kommt das Zeichen gar nicht vor

Pseudocodemaessig also:
bis zeile 6 --> datei wird geöffnet
7 - zeile wird eingelesen
8 variable doppelpunkt sucht :
9 wenn er vorkommt wird in
10 variable zeile = von links beginnend bis zum doppelpunkt (exklusive diesem selbst)

13 gleiches wie beim doppelpunkt mit der #
15 wenn # vorkommt wird die zeile gelöscht
21 datei schliessen
24 datei neu anlegen

lg
Edi
Member: pieh-ejdsch
pieh-ejdsch Jun 02, 2010 at 10:26:06 (UTC)
Goto Top
Hi dave,

eine Zeile im CMD reicht auch
for /f "delims=:" %i in ('findstr /v ^# "D:\Original.txt"') do echo %i>>"D:\Veraenderte.txt"  

sind sogar keine Leerzeilen dabei face-wink

Gruß Phil
Member: dave114
dave114 Jun 02, 2010 at 10:38:35 (UTC)
Goto Top
Edi leider erstellt er jetzt nur noch eine leere Datei face-sad

Was für ein Lehrer bist du?
Auch mal lustig wenn der Lehrer den Unterricht verlässt um ein bisschen zu surfen und Leuten im Forum zu helfen face-wink

Danke.
David
Member: Edi.Pfisterer
Edi.Pfisterer Jun 02, 2010 at 10:49:51 (UTC)
Goto Top
@ dave114: sorry, in der vorletzten Zeile war das "neu" verschluckt worden - im code oben bereits ausgebessert
@ pieh-ejdsch: so gehts natürlich auch face-wink
Nun meine Bitte an Dich: könntest du so nett sein, und den Code für uns kommentieren?
ich blick da leider nicht durch...

lg

/edit: hab ich oben überlesen: bin studierter Betriebswirt und Lehrer für selbiges und Wirtschaftsinformatik
Die SchülerInnen haben grad eine Arbeitsaufgabe und obwohl sie ja sehr sympatisch sind, ist es doch zu laaangweilig, ihnen beim Nachdenken zuzusehen... face-wink
Member: dave114
dave114 Jun 02, 2010 at 11:03:09 (UTC)
Goto Top
Danke für deine Lösung Phil.

Ich kann mich Edi anschließen und dich bitten uns den Code etwas zu erklären.

Und noch etwas:

Wie kann ich den Befehl in einer Batch verwenden?

Wenn ich z.B. die Batch über "call change.bat" aufrufe bekomme ich folgenden Fehler:

"i" ist syntaktisch an dieser Stelle nicht verarbeitbar.

@Edi
Ja das mit dem zugucken kann ich verstehen face-wink

mfg
David
Member: pieh-ejdsch
pieh-ejdsch Jun 02, 2010 at 11:27:50 (UTC)
Goto Top
Gerne

FOR /F "Delims=:" %i in ('Befehl') do Anweisung %i
- gib mir die Ausgabe bis vor dem "Trennzeichen=:" als %Variable der in (Klammern stehenden Datei oder der "Zeichenfolge" oder des 'Befehles') Zeilen weise in %Variable aus

ECHO %Variable>>"Datei"
- gib %Variable in das CMDfenster aus
"Datei"
- Leite das ganze fortlaufend jeweils eine Neue Zeile in die "Datei" um

findstr /v ^# "D:\Original.txt"
- Durchsuche die Datei "D:\Original.txt" und gib [/V] NICHT die Zeilen welche [^] am Zeilenanfang ein [#] enthalten aus. Also nur die anderen Zeilen.

[Edit]um diese Zeile in einen *.CMD oder *.BAT zu starten müssen die FOR Variablen mit doppelt vorangestellten Prozentzeichen dargestellt werden.
also %%i
[/Edit]
Member: Edi.Pfisterer
Edi.Pfisterer Jun 02, 2010 at 11:36:25 (UTC)
Goto Top
Super erklärt!
Vielen Dank!!!

lg

@dave114
Ich glaube mich aus einer Vielzahl ähnlicher Vorfälle (ich tippe 10 Zeilen vbs, jemand kommt dann mit 1 Zeile daher face-wink ) daran zu erinnern, dass für eine batch-Datei folgendes gilt:
% wird zu %%
Member: dave114
dave114 Jun 02, 2010 at 12:53:05 (UTC)
Goto Top
Nochmal vielen Dank euch beiden.

Viele Grüße.
David