geosem
Goto Top

Mit Batch-Datei eine Datei lesen, Zeilen ändern und als neue Datei schreiben

Hallo

Ich versuche nun schon seit einiger Zeit das "kleine" Script (unter Windows 8) zum laufen zu bringen - erfolglos.
Mit und ohne Hochkommas (braucht es diese beim SET?), mit ! und %, etc. alles hat nichts gebracht.
Dabei ist es sicher einfach wenn man weiss wie face-wink

Ich habe eine Datei (IN-DATEI) die wie folgt aussieht:
GC5CM98,2014-09-27T17:23Z,Found it,"111"
GC4Q9TG,2014-09-12T11:51Z,Found it,"112"
etc. weiter Zeilen

Nun möchte ich damit eine Neue Datei erstellen, die so aussieht:
GC5CM98,2014-09-27T17:23Z,Found it,"222"
GC4Q9TG,2014-09-12T11:51Z,Found it,"333"
etc. weiter Zeilen

Da habe ich z.B. mit folgenden Batch versucht:

SET s1=111
SET e1=222

SET s2=112
SET e2=333

FOR /F "delims=" %%a IN (IN-DATEI) DO (
SET zeile=%%a
SET zeile="zeile:%s1%=%e1%"
SET zeile="zeile:%s2%=%e2%"
%zeile%>>OUT-DATEI.txt
)
ECHO UMSTELLUNG BEENDET

Wo liegt der Haken, dass es nichts in die OUT-Datei schreibt. Ich habe an einigen Orten ein ECHO eingebaut, in %zeile% scheint nie was zu sein.

Viele Dank für Eure Hilfe und Grüsse aus dem Süden, geosem

Content-Key: 250806

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

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

Member: bastla
Solution bastla Oct 02, 2014 updated at 15:16:43 (UTC)
Goto Top
Hallo GeoSem und willkommen im Forum!

Mit ein paar kleinen Anpassungen (Stichwort "delayedExpansion") sollte Dein Ansatz funktionieren:
@echo off & setlocal enabledelayedexpansion
SET "s1=111"  
SET "e1=222"  

SET "s2=112"  
SET "e2=333"  

FOR /F "delims=" %%a IN (IN-DATEI) DO (  
    SET "zeile=%%a"  
    SET "zeile=!zeile:%s1%=%e1%!"  
    SET "zeile=!zeile:%s2%=%e2%!"  
    echo !zeile!>>OUT-DATEI.txt
)
ECHO UMSTELLUNG BEENDET
Die Anführungszeichen bei den SET-Anweisungen sind nicht unbedingt nötig, sorgen aber für eine eindeutige Textabgrenzung (sodass zB ein zusätzliches Leerzeichen nach "111" nicht mit in die Variable %s1% übernommen wird) ...

Grüße
bastla

P.S.: Wie Du Code hier im Forum formatieren kannst, steht hier ...
Member: GeoSem
GeoSem Oct 02, 2014 at 15:22:02 (UTC)
Goto Top
Vielen Dank bastla!

Ich habe die Zeilen übernommen ... das Batch läuft ab aber ich bekomme einfach keine Daten in das OUT-DATEI.txt
@echo off - das ist schon richtig mit "Affenschwanz"?
Member: bastla
bastla Oct 02, 2014 at 15:33:03 (UTC)
Goto Top
Hallo GeoSem!

Das "echo off" mit oder ohne "@" hat keine Auswierkung auf die Ausgabe in die Datei - allerdings kannst Du den Ablauf ohne "echo off" (oder stattdessen mit "echo on") besser nachvollziehen - vor allem, wenn Du am Ende noch eine Zeile
pause
hinzufügst oder den Batch aus einem CMD-Fenster startest.

Heißt Deine Ausgangsdatei tatsächlich "IN-DATEI" ohne ".txt" dahinter, und liegt sie im gleichen Ordner wie die Batch-Datei? Im Zweifelsfall kannst Du die Zeile 8 auf
FOR /F "usebackq delims=" %%a IN ("D:\Dein Ordner\IN-DATEI") DO (
abändern und den kompletten Dateipfad zwischen den Anführungszeichen angeben ...

Grüße
bastla
Member: GeoSem
GeoSem Oct 02, 2014 at 15:49:59 (UTC)
Goto Top
Schön dass Du so Geduld hast mit mir ... nicht selbstverständlich und ich weiss das zu schätzen!

Die Dateien heissen natürlich nicht wie angeben ... z.B. logs.txt statt OUT-DATEI.txt. Wenn ich die Input-Datei umbenenne kommt eine Fehlermeldung - daran sollte es auch nicht liegen.
Alle Daten und das umstell.bat liegt im gleichen Verzeichnis (\temp) und ich lasse das bat in der "Eingabeaufforderung" laufen.
Ich habe schon alles mit echo und pause versucht ... die Output-Datei wird einfach nicht erstellt.
Ich habe es auch schon auf einem andern PC versucht ... kann es vielleicht am Input-File liegen?
Member: bastla
bastla Oct 02, 2014 at 21:59:32 (UTC)
Goto Top
Hallo GeoSem!

Mit Deinen Testdaten und "echo on" in Zeile 1 sieht das bei mir in der CMD-Shell so aus:
D:>Ersetzen.cmd

D:>SET "s1=111"  

D:>SET "e1=222"  

D:>SET "s2=112"  

D:>SET "e2=333"  

D:>FOR /F "delims=" %a IN (IN-DATEI) DO (  
SET "zeile=%a"  
 SET "zeile=!zeile:111=222!"  
 SET "zeile=!zeile:112=333!"  
 echo !zeile! 1>>OUT-DATEI.txt
)

D:>(
SET "zeile=GC5CM98,2014-09-27T17:23Z,Found it,"111""  
 SET "zeile=!zeile:111=222!"  
 SET "zeile=!zeile:112=333!"  
 echo !zeile! 1>>OUT-DATEI.txt
)

D:>(
SET "zeile=GC4Q9TG,2014-09-12T11:51Z,Found it,"112""  
 SET "zeile=!zeile:111=222!"  
 SET "zeile=!zeile:112=333!"  
 echo !zeile! 1>>OUT-DATEI.txt
)

D:>ECHO UMSTELLUNG BEENDET
UMSTELLUNG BEENDET
Danach sieht der Inhalt der "OUT-Datei.txt" so aus:
GC5CM98,2014-09-27T17:23Z,Found it,"222"  
GC4Q9TG,2014-09-12T11:51Z,Found it,"333"  
Vergleiche das mit Deinem Ablauf ...

Grüße
bastla
Member: GeoSem
GeoSem Oct 03, 2014 updated at 11:19:13 (UTC)
Goto Top
So wäre es er perfekt ... nur bei mir werden die Zeilen 18-30 nicht angezeigt - aber warum?, denn deshalb wahrscheinlich der fehlende Output.
Leider habe ich nirgends gefunden wie man Bilder einbindet (erst jetzt gesehen; wäre im Ursprungsbeitrag möglich gewesen), deshalb so: http://www.xxx.ch/umstell.jpg (geändert, funktioniert nicht mehr)
Member: rubberman
Solution rubberman Oct 03, 2014 updated at 11:39:22 (UTC)
Goto Top
Hallo GeoSem,

sieht so aus als könnten die Daten in geocache_visits.txt nicht gelesen werden. Eine mögliche Ursache ist, dass die Zeichencodierung dort nicht ASCII oder ANSI ist.
Teste mal mit
FOR /F "delims=" %a IN ('TYPE "geocache_visits.txt"') DO (

Grüße
rubberman
Member: GeoSem
GeoSem Oct 03, 2014 at 11:10:27 (UTC)
Goto Top
So nun ist die Nuss geknackt ...
Ich habe mal die Input-Datei angeschaut ... da war die Codierung "Unicode". Nun habe ich diese als UTF-8 gespeichert und siehe da es läuft face-smile)))

Vielen Dank noch mal an bastla!!!!!!!
Member: GeoSem
GeoSem Oct 03, 2014 updated at 11:14:50 (UTC)
Goto Top
Danke rubberman
Deine Antwort ein bisschen früher und ich hätte Dank deinem Tipp viel Zeit zur Entspannung gehabt face-wink
Weisst Du vielleicht wo ich angeben kann dass es eine Unicode Codierung ist?
Member: rubberman
rubberman Oct 03, 2014 at 11:15:44 (UTC)
Goto Top
Haha, sorry aber das Thema stand die ganze Zeit schon auf gelöst und ich bin mehr zufällig drüber gestolpert, dass es noch offene Wunden gibt face-wink

Grüße
rubberman
Member: GeoSem
GeoSem Oct 03, 2014 updated at 11:21:38 (UTC)
Goto Top
Ja, ich habe aus Versehen "Zur Lösung beigetragen" angeklickt ... das ist ein bisschen ein irreführender Text ...
Member: rubberman
rubberman Oct 03, 2014 at 11:25:40 (UTC)
Goto Top
Weisst Du vielleicht wo ich angeben kann dass es eine Unicode Codierung ist?
Erklär mal was du damit meinst. Willst du die Ausgabe auch wieder in UNICODE oder wie soll ich das verstehen?

Grüße
rubberman
Member: GeoSem
GeoSem Oct 03, 2014 at 11:29:25 (UTC)
Goto Top
Ob ich die Datei dann weiter verarbeiten kann weiss ich noch nicht ... aber ich möchte vor allem einmal die Original-Datei verwenden können ohne zusätzlich von Unicode auf UTF-8 umzustellen.
Member: rubberman
rubberman Oct 03, 2014 at 11:33:11 (UTC)
Goto Top
Hast du versucht mit TYPE zu arbeiten, wie ich es dir oben vorgeturnt habe?
Member: GeoSem
GeoSem Oct 03, 2014 at 11:37:40 (UTC)
Goto Top
AHHHHH, SUPER nun geht's auch mit der Original-Datei face-smile
Auch Dir vielen Dank rubberman!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Member: rubberman
rubberman Oct 03, 2014 at 11:46:11 (UTC)
Goto Top
Kein Problem.

Eine UNICODE Ausgabedatei bekommst du übrigens etwa so:
@echo off &setlocal
SET "s1=111"  
SET "e1=222"  

SET "s2=112"  
SET "e2=333"  
FOR /F "TOKENS=2 DELIMS=:" %%i IN ('CHCP') DO SET /A oemcp=%%~ni  
>NUL CHCP 1252
<NUL >"OUT-DATEI.txt" SET /P "=ÿþ"  
FOR /F "delims=" %%a IN ('TYPE "geocache_visits.txt"') DO (  
    SET "zeile=%%a"  
    SETLOCAL EnableDelayedExpansion
    SET "zeile=!zeile:%s1%=%e1%!"  
    SET "zeile=!zeile:%s2%=%e2%!"  
    CMD /U /V:ON /C ">>"OUT-DATEI.txt" ECHO !zeile!"  
    ENDLOCAL
)
>NUL CHCP %oemcp%
ECHO UMSTELLUNG BEENDET
PAUSE
Grüße
rubberman
Member: GeoSem
GeoSem Oct 03, 2014 updated at 11:58:47 (UTC)
Goto Top
So, nun habe ich ein "neues" Problem

Wie kann ich SET "e1=mit dem Text unten sinnvoll eingeben ... so gibt es einen Syntaxfehler vermutlich wegen den geschützten Zeichen.
SET "e1=[font=Tahoma][size=3]  
Wir vergeben folgende Sterne - We avard the following stars (3=Super, 2=Gut/good 1=Normal):<br />
[red]&#10032;[/red][pink]&#10032;&#10032;[/pink] (2)&nbsp;
Wegführung und Standort - Routing and location<br />
[red]&#10032;[/red][pink]&#10032;&#10032;[/pink] (2)&nbsp;
Behälter: Art und Originalität - Container: type and originality<br />
[red]&#10032;[/red][pink]&#10032;&#10032;[/pink] (2)&nbsp;
Versteck und Beschreibung - Hidout and description<br />
<br />"  
Member: GeoSem
GeoSem Oct 03, 2014 at 12:04:19 (UTC)
Goto Top
OK, es hat funktioniert wenn ich alles auf eine Zeile schreibe ... ein bisschen unübersichtlich da die Zeilenlänge dann über 500 Charakter lang ist.
Gibt es eine andere Lösung?
Member: rubberman
Solution rubberman Oct 03, 2014 updated at 12:12:43 (UTC)
Goto Top
Huch face-surprise

Mehrzeilige Ersetzungen mit allen möglichen Sonderzeichen in einer Unicode Datei? Hättest du das mal von Anfang an geschrieben, hätten wir uns die Arbeit ersparen können so etwas in Batch umsetzen zu wollen. An der Stelle ist leider Ende mit Batch und wie das mit einer anderen Sprache umsetzbar wäre kommt darauf an wie deine Originaldatei tatsächlich aussieht (z.B. welche Art von Zeilenumbruch vorliegt etc.).

Grüße
rubberman

EDIT: Ah, also doch nicht mehrzeilig?

Nee, lass das mal in einer Zeile. Alles andere wird noch komplizierter.
Member: GeoSem
GeoSem Oct 03, 2014 at 12:11:53 (UTC)
Goto Top
OK, es geht ja wenn ich alles auf eine Zeile schreibe face-smile
Damit kann ich gut leben ... habe dann 27 Varianten und muss halt einfach 27x den Text leicht ändern
Danke nochmals und Grüsse aus dem Süden, Walter