clash2345
Goto Top

Per .bat Datei eine Zeile in vorhandene txt Datei einfügen - Teil 2 mit spezieller Anforderung

Hallo Forum,

zunächst erstmal einen herzlichen Gruß und hiermit meinen ersten Beitrag ;)

Der erste Beitrag schließt sich gleich mit einer Frage an.

Folgendes muss ich umsetzen.
ich möchte die erste Zeile meiner txt Datei kopieren und umbedannt in die zweite Zeile einfügen.
Statisch habe ich es schon mit deiner Lösung in diesem Thread geschafft. ...
Das wäre dieser Code:

@echo off & setlocal
set "Zusatz=Ausgabe der Zischendatei: W:\T128-VDB\Ordner\Ordner1\b110124.001\ARCHIV\X0001R.JPG"
set "Nach=Ausgabe der Zischendatei: W:\T128-VDB\Ordner\Ordner1\b110124.001\ARCHIV\X0001.DTA"
set "Datei=D:\Textfile.txt"
set "DateiTmp=%temp%\Textfile.tmp"
move "%Datei%" "%DateiTmp%"
for /f "delims=" %%i in (%DateiTmp%) do (
"%Datei%" echo %%i
echo %%i|findstr /b "%Nach%">nul && >>"%Datei%" echo %Zusatz%
)

Mein Problem ist allerdings, das das kopieren und einfügen der Zeilen nicht statisch sonder variabel sein muss.
Die erste Zeile meiner txt Datei lautet:
W:\T128-VDB\Ordner\Ordner1\b110124.001\ARCHIV\X0001.DTA
diese String soll kopiert und als
W:\T128-VDB\Ordner\Ordner1\b110124.001\ARCHIV\X0001R.JPG drunter eingefügt werden.

Wie der Name x0001.DAT schon vermuten lässt, ist dies nur eine von vielen. Es gibt also auch eine Datei mit der Endung x0456.DAT in der ersten Zeile. Daraus muss dann x0456R.JPG werden. usw.

Hast Du hierfür eine Idee wie man dies realisieren kann?
Gruß
Clash

Content-Key: 161281

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

Printed on: April 25, 2024 at 08:04 o'clock

Member: bastla
bastla Feb 22, 2011 at 08:46:52 (UTC)
Goto Top
Hallo clash2345!

Das könnte so gehen:
@echo off & setlocal
set "Ordner=D:\"  
set "Maske=x*.txt"  

pushd "%Ordner%"  
for /f "delims=" %%i in ('dir /b /a-d "%Maske%"') do call :ProcessFile "%%i"  
popd
goto :eof

:ProcessFile
set /p Zeile1=<%1
for /f "delims=" %%a in ("%Zeile1%") do set "Zeile2=%%~dpnaR.jpg"  
> "%~n1-neu%~x1" echo %Zeile1%  
>>"%~n1-neu%~x1" echo %Zeile2%  
>>"%~n1-neu%~x1" more +1 %1  
goto :eof
wobei hier zu Testzwecken zunächst jeweils eine Datei "x####-neu.dat" erstellt wird. Wenn das Ergebnis zufriedenstellend ist, kann mit
move "%~n1-neu%~x1" %1
- zwischen Zeile 15 und 16 eingefügt - die alte Datei durch die neue Fassung ersetzt werden.

Grüße
bastla

[Edit] Fehlendes Anführungszeichen in Zeile 6 ergänzt und im Gegenzug überzähliges Prozentzeichen in Zeile 12 entfernt [/Edit]
Member: clash2345
clash2345 Feb 22, 2011 at 09:42:39 (UTC)
Goto Top
Hallo bastla,

vielen Dank für Deine Antwort und deine Mühe!
Leider klappts noch nicht, da ich mich womöglich missverständlich ausgedrückt habe.
Ich habe in meinem Ordner zb. "D:\" eine "X0001.txt" liegen.
In dieser steht in der ersten Zeile "W:\T128-VDB\Ordner\Ordner1\b110124.001\ARCHIV\X0001.DTA"
In die zweite Zeile müsste abgeleitet von der ersten W:\T128-VDB\Ordner\Ordner1\b110124.001\ARCHIV\X0001R.JPG" eingefügt werden.

Die Variable dabei ist x0001. Es wird auch eine txt geben, die zb. x0456.txt heisst. In dieser steht dann in der ersten Zeile ...\X0456.DTA
Hier müsste in der zweiten dann entsprechend X0456R.JPG stehn.

Mit obigen Code von bastla bekomme ich folgende Fehlermeldung: "<" kann syntaktisch an dieser Stelle nicht verarbeitet werden.

Gruß und Dank
Clash
Member: Biber
Biber Feb 22, 2011 at 10:19:44 (UTC)
Goto Top
Moin Clash,

ändert sich das Verhalten des Batches, wenn du statt der Wildcards "x*.dat", die bastla in Zeile 3 angegeben hat, die Dateimaske "x*.dta" angibst?

Grüße
Biber
Member: bastla
bastla Feb 22, 2011 at 10:25:23 (UTC)
Goto Top
Hallo clash2345!

Ich habe noch einen Fehler in Zeile 6 korrigiert und den Typ für die Suchmaske, wenn es denn weder "dat" noch "dta" sein soll, auf "txt" geändert.

Grüße
bastla
Member: clash2345
clash2345 Feb 22, 2011 at 10:42:17 (UTC)
Goto Top
Das skript läuft nun zwar durch, aber ändert die txt nicht.
Die bat und txt liegen im selben Ordner. D:\

Gruß
Member: pieh-ejdsch
pieh-ejdsch Feb 22, 2011 at 10:49:40 (UTC)
Goto Top
moin clash,

Zitat von @bastla:
wobei hier zu Testzwecken zunächst jeweils eine Datei "x####-neu.dat" erstellt wird. Wenn das Ergebnis
zufriedenstellend ist, kann mit
move "%~n1-neu%~x1" %1
- zwischen Zeile 15 und 16 eingefügt - die alte Datei durch die neue Fassung ersetzt werden.

Gruß Phil
Member: bastla
bastla Feb 22, 2011 at 10:53:31 (UTC)
Goto Top
@ph
Danke für's Aushelfen ... face-smile

Exakter wäre übrigens (schon immer gewesen face-wink): "x####.<Typ lt Vorgabe in Batch-Zeile 3>" (ist ja inzwischen ".txt") ...

Grüße
bastla
Member: clash2345
clash2345 Feb 22, 2011 at 10:56:34 (UTC)
Goto Top
Mein Fehler. Es wird ja eine neue Datei geschrieben. Leider wird jetzt in der zweiten Zeile ein D:\ vorangestellt, was die Datei entscheident verändert.
Denn ich greife aus der Datei festen Zeilen und Spaltenzeichen ab.
Zeile 2 habe ich versucht zu entfernen oder zu ändern. Leider Ohne Erfolg face-sad

Die Ausgabe lautet jetzt
W:\T128-VDB\scheck\easy\b110124.001\ARCHIV\X0001.DTA
D:\ W:\T128-VDB\scheck\easy\b110124.001\ARCHIV\X0001R.jpg

Das D:\ wäre zuviel ;)
Member: bastla
bastla Feb 22, 2011 at 11:22:49 (UTC)
Goto Top
Hallo clash2345!

Selbst mit dem überzähligen Prozentzeichen in Zeile 12 (ist oben inzwischen entfernt) kann ich das anhand meines geposteten Batches und einer Testdatei mit dem Inhalt
W:\T128-VDB\scheck\easy\b110124.001\ARCHIV\X0001.DTA
Zeile2
Zeile3
Zeile4
nicht nachvollziehen ...

Wie sieht denn inzwischen der Batch bei Dir aus?

Grüße
bastla
Member: clash2345
clash2345 Feb 22, 2011 at 11:27:41 (UTC)
Goto Top
Hallo bastla,

in die eingefügte Zeile wird bei mir ein D:\ vorangestellt. (liegt bei mir im root des Laufwerks D:\)
Packe ich bat und txt in C:\ habe ich in der zweiten ein C:\ vorangestellt.

gruß
clash
Member: bastla
bastla Feb 22, 2011 at 11:31:16 (UTC)
Goto Top
Hallo clash2345!

Könntest Du bitte den Stand des Batches bei Dir (unter Verwendung von ""-Formatierung) und, falls diese von meinem Beispiel abweichen sollte, die erste Zeile Deiner Testdatei, posten?

Grüße
bastla
Member: clash2345
clash2345 Feb 22, 2011 at 11:36:41 (UTC)
Goto Top
Hallo basla,

@echo off & setlocal
set "Maske=x*.txt"  
set "Ordner=D:\"  
pushd "%Ordner%"  
for /f "delims=" %%i in ('dir /b /a-d "%Maske%"') do call :ProcessFile "%%i"  
popd
goto :eof

:ProcessFile

set /p Zeile1=<%1
for /f "delims=" %%a in ("%Zeile1%") do set "Zeile2=%%~dpnaR.jpg%"  
> "%~n1-neu%~x1" echo %Zeile1%  
>>"%~n1-neu%~x1" echo %Zeile2%  
>>"%~n1-neu%~x1" more +1 %1  
move "%~n1-neu%~x1" %1  
goto :eof

Ausgabe lautet dann:
Ausgabe der Zischendatei:               W:\T128-VDB\Ordner\Ordner1\b110124.001\ARCHIV\X0001.DTA
D:\Ausgabe der Zischendatei:               W:\T128-VDB\Ordner\Ordner1\b110124.001\ARCHIV\X0001R.jpg

System windows7 64bit
Member: bastla
bastla Feb 22, 2011 at 11:43:23 (UTC)
Goto Top
Hallo clash2345!

Dass mehr als
W:\T128-VDB\Ordner\Ordner1\b110124.001\ARCHIV\X0001.DTA
in der Zeile 1 steht, ist jetzt aber neu (und das Ergebnis damit nicht überraschend) ...

Wird die Struktur der Zeile immer so bleiben bzw wird da ev einmal "Zwischendatei" stehen? Sind das zwischen "Zischendatei:" und "W:" Leerzeichen oder TAB?

Grüße
bastla
Member: clash2345
clash2345 Feb 22, 2011 at 11:49:49 (UTC)
Goto Top
Ja, dies wird so bleiben.
Die Textdateien sind output Dateien aus einem Archivsystem. Und stehen fest.
Das Mehr als
W:\T128-VDB\Ordner\Ordner1\b110124.001\ARCHIV\X0001.DTA
bleibt stehen.
Ist dies von Relevanz?

Gruß und Dank
Clash
Member: bastla
bastla Feb 22, 2011 at 11:55:13 (UTC)
Goto Top
Hallo clash2345!
Ist dies von Relevanz?
Teste mal kurz mit dem von mir geposteten Beispiel und frage (Dich) dann nochmal ... face-wink

... und dann ersetze die Zeile 12 durch:
for /f "delims=" %%a in ("%Zeile1:~40%") do set "Zeile2=%Zeile1:~,40%%%~dpnaR.jpg"
Es werden so die ersten 40 Zeichen der Zeile 1 unverändert in die Zeile 2 geschrieben und der ab Zeile 41 angegebene Pfad angepasst ...

Grüße
bastla
Member: clash2345
clash2345 Feb 22, 2011 at 13:43:10 (UTC)
Goto Top
Jeah! Ich danke Dir! Das hatte ich nicht berücksichtigt, da sich leider bei mir der Denkfehler eingeschlichen hat, das man vom ersten bat ausgehen könnte.

set "Zusatz=Ausgabe der Zischendatei: W:\T128-VDB\Ordner\Ordner1\b110124.001\ARCHIV\X0001R.JPG"  
set "Nach=Ausgabe der Zischendatei: W:\T128-VDB\Ordner\Ordner1\b110124.001\ARCHIV\X0001.DTA"  

Einen hätte ich leider noch. :D
Ich habe da ja die Datei mit dem Namen X0001.TXT.
Was sich nun im laufe meiner Arbeit ergeben hat, ist das ich abhängig vom Dateinamen in die erste Zeile X0001.JPG und in die zweite Zeile X0001R.JPG schreiben muss.
Also eine leicht andere Variante als die erste lösung, bei der ich dachte so könnte ich es gebrauchen.
Member: bastla
bastla Feb 22, 2011 at 13:50:44 (UTC)
Goto Top
Hallo clash2345!

Ersetze die Zeile 12 durch diese beiden Zeilen:
for /f "delims=" %%a in ("%Zeile1:~40%") do set "Zeile1=%Zeile1:~,40%%%~dpa%~n1.JPG"  
for /f "delims=" %%a in ("%Zeile1:~40%") do set "Zeile2=%Zeile1:~,40%%%~dpnaR.JPG"  
Um für weitere Änderungen vorzubauen:
%Zeile1:~,40%
liefert die ersten 40 Zeichen aus der Variablen %Zeile1%,
%Zeile1:~40%
überspringt die ersten 40 Zeichen aus der Variablen %Zeile1% und gibt den Rest (in diesem Fall also den gesuchten Pfad) zurück.

Mit
%%~dpa
wird Laufwerksbuchstabe ("drive") und Pfad ("path") des über die Schleifenvariable "%%a" angesprochenen Pfades verwendet und um
%~n1
den Namensanteil ("name") ohne Typ ("extension") des als Parameter %1 übergebenen Dateinamens sowie den konstanten Wert ".JPG" ergänzt.

Grüße
bastla
Member: clash2345
clash2345 Feb 23, 2011 at 09:39:00 (UTC)
Goto Top
Hallo bastla,

vielen Dank für deine Hilfe! Nun klappt alles.
Jetzt kann ich mich an meine eigentliche Arbeit machen und damit einen massen Import starten.

Vielen Dank!
Member: clash2345
clash2345 Feb 23, 2011 at 10:40:18 (UTC)
Goto Top
Eine Frage hätte ich allerdings noch.
Ich hab in meiner txt in der ersten zeile was stehen.
Aus dem Dateinamen X0001.txt muss ich den Namen der Dartei auslesen und in Zeile 1 schreiben:
x0001.JPG. In zeile zwei:
x0001R.JPG

Was vorher Zeile 1 war, soll jetzt automatisch durch die beiden vorangestellten Zeilen in Zeile 3 wandern.
Ich hab mit obiger Anleitung versucht mit den längen der %Zeile1:~,40% und %Zeile1:~40% zu experimentieren,
aber mir ist es nicht so recht gelungen. Bei mir wird oft die 1 Zeile gelöscht und durch x0001.JPG und X0001R.JPG ersetzt.

Gruß
Clash
Member: bastla
bastla Feb 23, 2011 at 14:07:49 (UTC)
Goto Top
Hallo clas2345!

Wenn es also darum geht, an den Anfang der Datei die beschriebenen (sich aus dem Namen der bearbeiteten Datei ergebenden) Zeilen einzufügen und den Rest unverändert zu lassen, sähe das so aus:
@echo off & setlocal
set "Maske=x*.txt"  
set "Ordner=D:\"  
pushd "%Ordner%"  
for /f "delims=" %%i in ('dir /b /a-d "%Maske%"') do call :ProcessFile "%%i"  
popd
goto :eof

:ProcessFile
> "%~n1-neu%~x1" echo %~n1.JPG  
>>"%~n1-neu%~x1" echo %~n1R.JPG  
>>"%~n1-neu%~x1" type %1  
move "%~n1-neu%~x1" %1  
goto :eof
Sollte doch der Dateiname aus der originalen ersten Zeile gefragt sein, würde das ab ":ProcessFile" so aussehen:
:ProcessFile
for /f "delims=" %%a in ("%Zeile1:~40%") do (  
    echo %%~na.JPG
    echo %%~naR.JPG
)>"%~n1-neu%~x1"  
>>"%~n1-neu%~x1" type %1  
move "%~n1-neu%~x1" %1  
goto :eof
Grüße
bastla