dergringo73
Goto Top

Batch: Datei mit Datei durchsuchen

Hallo
Ich habe folgendes Script was ich nun verändern möchte. Kurz zum aktuellen Stand:
In der Datei products.json sollen jeweils 2 Werte geändert werden. Im Anschluss soll die Datei als product.json in ein Zip Archiv gepackt werden.

Was ich nun ändern möchte:
Statt die Werte Suchen1/Ersetzen1 und Suchen2/Ersetzen2 in der Batch einzugeben will ich dafür eine andere Datei (TXT oder CSV) verwenden. Grund dafür ist das immer mehrere Farben ersetzt werden müssen.

Die TXT zum ersetzen würde ich gern so anlegen

Suchen1;Ersetzen1;Suchen2;Ersetzen2
Farbwelt;Farbwelt rot;#ffffff;#ff0000
Farbwelt;Farbwelt gelb;#ffffff;#f6ff00

Ist das möglich?? Kann mir jemand helfen?

hier das Script was mir derzeit hilft

@echo off & setlocal enabledelayedexpansion
set "Datei=products.json"   
set "t=Temp.tmp"   
set "Suchen1=Farbwelt"  
set "Ersetzen1=Farbwelt rot"  
set "Suchen2=#ffffff"  
set "Ersetzen2=#ff0000"  

if exist "%t%" del "%t%"  
for /f "delims=" %%i in ('findstr /n $ "%Datei%"') do set "Line=%%i" & call :ProcessLine  
move "%t%" "D:\neu\product.json"  
goto :WEITER_IM_BATCH

:ProcessLine
for /f "tokens=1* delims=:" %%a in ("%Line%") do set "L=%%b"  
if not defined L >>"%t%" echo\& goto :eof  
set WriteLine1=!L:%Suchen1%=%Ersetzen1%!
set WriteLine2=!WriteLine1:%Suchen2%=%Ersetzen2%!
>>"%t%" echo !WriteLine2!  
goto :eof
:WEITER_IM_BATCH

echo } >> D:\neu\product.json

CD /D "C:\Program Files (x86)\7-Zip"  
7z.exe a D:\neu\%Ersetzen1%.zip "D:\neu\product.json"  
EXIT

Content-Key: 572048

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

Printed on: April 23, 2024 at 20:04 o'clock

Member: TK1987
TK1987 May 15, 2020 updated at 09:25:17 (UTC)
Goto Top
Moin,

Zitat von @dergringo73:
Was ich nun ändern möchte:
Statt die Werte Suchen1/Ersetzen1 und Suchen2/Ersetzen2 in der Batch einzugeben will ich dafür eine andere Datei (TXT oder CSV) verwenden. Grund dafür ist das immer mehrere Farben ersetzt werden müssen.

Die TXT zum ersetzen würde ich gern so anlegen

Suchen1;Ersetzen1;Suchen2;Ersetzen2
Farbwelt;Farbwelt rot;#ffffff;#ff0000
Farbwelt;Farbwelt gelb;#ffffff;#f6ff00

Ist das möglich?? Kann mir jemand helfen?
Möglich klar... ob das mit Batch noch sinnvoll ist, sei mal dahingestellt.
Schmeiss Zeile 4-7 raus und ändere Zeile 10 wie folgt ab:
for /f "delims=" %%i in ('findstr /n $ "%Datei%"') do (  
  set "Line=%%i"  
  for /f "Tokens=1-4 usebackq Skip=1 Delims=;" %%a in ("Datei.CSV") do (  
    set Suchen1=%%a
    set Ersetzen1=%%b
    set Suchen2=%%c
    set Ersetzen2=%%d
    call :ProcessLine
    )
  >>"%t%" echo !WriteLine2!  
  )
Datei.CSV muss natürlich ggfs ersetzt werden, dass Skip=1 brauchst du nur, falls die Daten wie in deinem Beispiel Überschriften haben.

Ungetestet, aber sollte so passen.

Edit: Der Output darf natürlich erst statt finden, nachdem die Schleife zum ersetzen durch ist. Zeile 19 muss also auch raus, bzw hinter die Schleife, s.o.

Gruß Thomas
Member: dergringo73
dergringo73 May 15, 2020 at 10:29:33 (UTC)
Goto Top
Danke erstmal für die genial hilfe face-smile

@echo off & setlocal enabledelayedexpansion
set "Datei=products.json"   
set "t=Temp.tmp"   
for /f "delims=" %%i in ('findstr /n $ "%Datei%"') do (  
  set "Line=%%i"  
  for /f "Tokens=1-4 usebackq Skip=1 Delims=;" %%a in ("Datei.CSV") do (  
    set Suchen1=%%a
    set Ersetzen1=%%b
    set Suchen2=%%c
    set Ersetzen2=%%d
    call :ProcessLine
    )
  >>"%t%" echo !WriteLine2!  
  )
move "%t%" "D:\neu\product.json"  
goto :WEITER_IM_BATCH

:ProcessLine
for /f "tokens=1* delims=:" %%a in ("%Line%") do set "L=%%b"  
if not defined L >>"%t%" echo\& goto :eof  
set WriteLine1=!L:%Suchen1%=%Ersetzen1%!
set WriteLine2=!WriteLine1:%Suchen2%=%Ersetzen2%!
goto :eof
:WEITER_IM_BATCH

echo } >> D:\neu\product.json

CD /D "C:\Program Files (x86)\7-Zip"  
7z.exe a D:\neu\%Ersetzen1%.zip "D:\neu\product.json"  
EXIT    

so haben ich es jetzt umgesetzt und zum Test eine Datei.csv mit 4 Zeilen angelegt (incl. Überschriften). Erstellt wird aber nur die letzte Zeile der in csv. Ich denke das liegt daran das die Klammer falsch sitzt oder?
Member: TK1987
TK1987 May 15, 2020 updated at 11:00:37 (UTC)
Goto Top
Nein, die Klammer sitzt schon richtig, allerdings muss die For-Schleife in Zeile 19 noch vor die Schleife mit den Ersetzungen, sonst wird %L% natürlich immer neu erstellt.

Warum nutzt du eigentlich mehrere Variablen, um die Ersetzungen durchzuführen? Bleib doch einfach bei %Line%.
@echo off & setlocal enabledelayedexpansion
set "Datei=products.json"   
set "t=Temp.tmp"   
for /f "delims=" %%i in ('findstr /n $ "%Datei%"') do (  
  for /f "tokens=1* delims=:" %%a in ("%%i") do set "Line=%%b"  
  for /f "Tokens=1-4 usebackq Skip=1 Delims=;" %%a in ("Datei.CSV") do (  
    set Suchen1=%%a
    set Ersetzen1=%%b
    set Suchen2=%%c
    set Ersetzen2=%%d
    call :ProcessLine
    )
  >>"%t%" echo !Line!  
  )
move "%t%" "D:\neu\product.json"  
goto :WEITER_IM_BATCH

:ProcessLine
if not defined Line >>"%t%" echo\& goto :eof  
set Line=!Line:%Suchen1%=%Ersetzen1%!
set Line=!Line:%Suchen2%=%Ersetzen2%!
goto :eof
:WEITER_IM_BATCH

echo } >> D:\neu\product.json

CD /D "C:\Program Files (x86)\7-Zip"  
7z.exe a D:\neu\%Ersetzen1%.zip "D:\neu\product.json"  
EXIT  

Teste mal. Falls die Ausgabe immer noch nicht wie gewünscht ist, bitte auch mal ein Textbeispiel für die products.json und die Csv-Datei posten, damit ich hier mit den selben Bedingungen testen kann.
Member: dergringo73
dergringo73 May 15, 2020 at 11:11:16 (UTC)
Goto Top
Die product.json die erstellt wird ist nicht das Problem. Die Datei hat den richtigen Inhalt. Es wird aber immer nur 1 Zip mit einer product.json darin erstellt. In meiner csv sind aber 4 Zeilen (3 Datensätze + Überschrift) und ich bräuchte auch 3 Zip Dateien mit jeweils einer product.json darin.

Dafür hatte ich unten

echo } >> D:\neu\product.json

CD /D "C:\Program Files (x86)\7-Zip"  
7z.exe a D:\neu\%Ersetzen1%.zip "D:\neu\product.json"  
Member: dergringo73
dergringo73 May 15, 2020 at 15:30:04 (UTC)
Goto Top
Ich habe es jetzt gerade nochmals mit deinem Code:
@echo off & setlocal enabledelayedexpansion
set "Datei=products.json"   
set "t=Temp.tmp"   
for /f "delims=" %%i in ('findstr /n $ "%Datei%"') do (  
  for /f "tokens=1* delims=:" %%a in ("%%i") do set "Line=%%b"  
  for /f "Tokens=1-4 usebackq Skip=1 Delims=;" %%a in ("Datei.CSV") do (  
    set Suchen1=%%a
    set Ersetzen1=%%b
    set Suchen2=%%c
    set Ersetzen2=%%d
    call :ProcessLine
    )
  >>"%t%" echo !Line!  
  )
move "%t%" "D:\neu\product.json"  
goto :WEITER_IM_BATCH

:ProcessLine
if not defined Line >>"%t%" echo\& goto :eof  
set Line=!Line:%Suchen1%=%Ersetzen1%!
set Line=!Line:%Suchen2%=%Ersetzen2%!
goto :eof
:WEITER_IM_BATCH

echo } >> D:\neu\product.json

CD /D "C:\Program Files (x86)\7-Zip"  
7z.exe a D:\neu\%Ersetzen1%.zip "D:\neu\product.json"  
EXIT  

getestet. Es wird am Ende eine .zip erstellt. Dateinamen ist der letzte %Ersetzen1% Wert. In der Zip die product.json hat jedoch den Inhalt der ersten Zeile (aus der .csv)