Batch Textdateien - Stapelverarbeitung

M

Mister Blue Sky

Gast
Hi Leute, habe folgendes Problem:

[1. Keinen blassen Schimmer von Batch-Programmierung - und zweitens]

In einem Verzeichnis befinden sich mehrere Text-Files, die alle gleich strukturiert sind:

Beispiel: Metallica - Enter Sandman.txt

Code:
Metallica - Enter Sandman



Say your prayers little one
Don`t forget my son
To include everyone ...

Textblock ...

Textblock ...

Textblock ...

Erläuterung: Die erste Zeile besteht aus einem String mit Leerzeichen ohne Umbruch.

Es folgen 3 Leerzeilen. Darauf folgen Textblöcke unterschiedlicher Anzahl, die jeweils durch eine Leerzeile voneinander getrennt sind.


-----------------------------------------------------------------------------


Benötigen würde ich die Text-Dateien aber in dieser Form:

Beispiel: Metallica - Enter Sandman.txt

Code:
[COLOR="Red"][FONT="Fixedsys"]<h1>[/FONT][/COLOR]Metallica - Enter Sandman[COLOR="Red"][FONT="Fixedsys"]</h1>[/FONT][/COLOR]

[COLOR="Red"][FONT="Fixedsys"]<pre>[/FONT][/COLOR]
Say your prayers little one
Don`t forget my son
To include everyone ...

Textblock ...

Textblock ...

Textblock ...
[COLOR="Red"][FONT="Fixedsys"]</pre>[/FONT][/COLOR]

Erläuterung: Jede erste Zeile sollte mit <h1> beginnen und mit </h1> enden.

In jede dritte Zeile der Dateien sollte der String <pre> geschrieben werden.
Am Ende des Inhalts einer Datei sollte </pre> geschrieben werden.

[Hinweis: Eine PHP-Lösung mit preg_match ist keine Option - das Ganze soll per File-Protokoll funktionieren]


BS
 
Hier bitteschön, so kannst du die Dateien umformen:

Code:
@echo off
setlocal enabledelayedexpansion
set count=0

for /F "tokens=1* delims=]" %%h in ('type "test1.txt" ^| find /V /N ""') do (

if "!count!"=="0" (
echo.^<h1^>%%i^</h1^>
) else if "!count!"=="3" (
echo.^<pre^>
) else (
if "%%i"=="" (echo.) else (echo %%i)
)

set /a count=!count!+1

)

echo.^</pre^>

Wie du jetzt die ganzen Dateien durchgehst, musst du schon selber rausfinden. :p

Falls was unklar ist, einfach nachfragen!
 
Zuletzt bearbeitet: (Leerzeilen bleiben nun erhalten+pre direkt vor Text)
Hallo, Danke für Dein Interesse. Das Skript funktioniert [bei mir - bis jetzt] aber leider nicht.

Daher hab ich erst mal getestet, ob *.bat - Files auf meinem System funktionieren:

x.bat

Code:
[COLOR="Navy"]@echo off

if not exist c:\bat\nul md c:\bat[/COLOR]

Doppelklick -> das bislang nicht vorhandene Verzeichnis C:\bat wurde angelegt - *.bat - Files funktionieren.

--------------------------------------------------------------------------

Zweitens: Testverzeichnis "Neuer Ordner" auf dem Desktop angelegt.
Inhalt:test1.txt

Code:
Alabama 3 - Woke up this morning


I woke up this morning
Got myself a gun,
Mama always said I'd be the
Chosen One.

Textblock ...

und Deine test.bat

Code:
@echo off
setlocal enabledelayedexpansion
set count=0

for /F "tokens=1* delims=]" %%h in ('type "test1.txt" ^| find /V /N ""') do (

if "!count!"=="0" (
echo.^<h1^>%%i^</h1^>
) else if "!count!"=="3" (
echo.^<pre^>
) else (
if "%%i"=="" (echo.) else (echo %%i)
)

set /a count=!count!+1

)

echo.^</pre^>

Doppelklick -> Keine Veränderung der Datei test1.txt.



BS
 
Öffne mal eine Konsole und lass dir die Ausgabe von meinem Script anzeigen ;)
Bisher wird da noch nichts gespeichert.

Mit > bzw >> kannst du die Ausgabe eines jeden Befehls zB in eine Datei umleiten, wobei > die Datei überschreibt, wenn die bereits vorhanden ist, und >> die Ausgabe an die Datei anhängt.

Ich hab mein Script mal dahingehend angepasst, jedoch würde ich dir dringend empfehlen, dich zumindest mit den Grundzügen von Batch Programmierung vertraut zu machen.

Code:
@echo off
setlocal enabledelayedexpansion
set count=0
set datei=test1.txt

for /F "tokens=1* delims=]" %%h in ('type "%datei%" ^| find /V /N ""') do (

if "!count!"=="0" (
echo.^<h1^>%%i^</h1^>>%datei%
) else if "!count!"=="3" (
echo.^<pre^>>>%datei%
) else (
if "%%i"=="" (echo.>>%datei%) else (echo %%i>>%datei%)
)

set /a count=!count!+1

)

echo.^</pre^>>>%datei%
 
Danke, das funktioniert schon mal.

Muß nur die Leerzeichen in den Dateinamen mit einem Unterstrich ersetzen - und wieder zurück - kein Problem.

Code:
@echo off
setlocal enabledelayedexpansion
set count=0

REM ------------------------------------------------------------

REM ----- set datei=test1.txt --------------- Funktioniert
REM ----- War - Why Cant We Be Friends.txt -- Funktioniert nicht

REM ------------------------------------------------------------


set datei=War_-_Why_Cant_We_Be_Friends.txt

Btw: Hast natürlich völlig recht - das ich mich mit den Grundzügen der Batch-Programmierung vertraut machen sollte - was ich auch tun werde.

Allein schon deshalb, weil ja ganze Listen erzeugt [chip.de: Listenerzeuger Dirit] , ins Script einfügt und abgearbeitet werden sollen.


Nochmals Danke

BS
 
Wegen den Leerzeichen im Dateinamen: Das hatte ich irgendwie nicht bedacht, ist aber natürlich kein Problem:

Um die Argumente des set Kommandos einfach Anführungzeichen: set "datei=War - Why Cant We Be Friends.txt"
Zusätzlich müssen überall bei der Ausgabe Anführungszeichen um den Dateinamen: ...>>"%datei%"

Gesamtes Skript:

Code:
@echo off
setlocal enabledelayedexpansion
set count=0
set "datei=Test Datei mit Leerzeichen.txt"

for /F "tokens=1* delims=]" %%h in ('type "%datei%" ^| find /V /N ""') do (

if "!count!"=="0" (
echo.^<h1^>%%i^</h1^>>"%datei%"
) else if "!count!"=="3" (
echo.^<pre^>>>"%datei%"
) else (
if "%%i"=="" (echo.>>"%datei%") else (echo %%i>>"%datei%")
)

set /a count=!count!+1

)

echo.^</pre^>>>"%datei%"

Wegen deinen Listen:
Man kann mit dem for Befehl nicht nur Dateien durchlaufen, sondern auch Verzeichnisse. Gib dazu am besten einfach mal "for /?" in eine Konsole ein und lies dir die Dokumentation durch. :)
 
Sry, wegen verspäteter Antwort [war ne stressige Woche]

Dein Programm [#6] läuft ex aequo Deiner Beschreibung [funktioniert - Leerzeichen werden akzeptiert]

Bin gerade beim modifizieren - THX
 
Zurück
Oben