sl3
Goto Top

Per Batchdatei Textdateien bearbeiten

Über den find- Befehl und das >/>> am Ende von Batch- Befehlen hinausgehende Funktionen zum Bearbeiten von Dateien per Batchdatei

Ich habe folgendes Problem: Ich würde gerne per Batchdatei Dateien bearbeiten. Die Funktionen, die mir da bisher bekannt sind, sind mir zu wenig. Als Beispiel nehme ich die Datei C:\test.txt. Ich kann z. B. echo abc>>C:\test.txt schreiben, dann wird hinten in der Datei abc hingeschrieben. Jedoch hätte ich gerne noch weitere Funktionen. Was ich mir wünschen würde, ist folgendes:
1. Löschen von Teilen der Datei. Wenn also beispielsweise eine Zeile abc xyz stv in der Datei steht, würde ich gerne xyz löschen können. Auch Zeilenumbrüche würde ich gerne löschen können.
2. Die Alles Ersetzen- Funktion.
3. Hinzufügen von Text an beliebigen Stellen, auch mitten in Zeilen, also nicht nur am Ende der Datei, wie es bei Batch- Befehlen mit >>C:\test.txt am Ende möglich ist. Außerdem würde ich gerne Zeilenumbrüche an beliebigen Stellen erstellen können. In diesem Zusammenhang hätte ich gerne eine Suchfunktion. Damit meine ich, wenn in der Datei eine Zeile abc xyz stv steht, dass ich z. B. genau nach dieser Zeile eine weitere Zeile hinzufügen kann, egal, ob abc xyz stv in Zeile 25, 40 oder welcher auch immer steht.
Es wäre jeweils kein Problem, wenn die Veränderungen in der Datei dazu führen würden, dass dafür eine neue Datei erstellt wird, obwohl es aus meiner Sicht besser wäre, wenn die Veränderungen direkt in der Datei gemacht würden. Die Funktionen des find- Befehls sind mir übrigens bekannt, aber meines Wissens sind die 3 Punkte, die mir fehlen, damit nicht möglich.
Es wäre kein Problem, wenn dafür eine externe Software erforderlich ist, mit Bordmitteln geht es meines Wissens sowieso nicht. Die Betriebssysteme, auf denen ich das benutzen will, sind Windows XP Pro und Home. Ich weiß nicht, ob solche Funktionen mit Batchdateien überhaupt möglich sind, aber wenn jemand zu einem der Punkte was weiß, würde ich mich freuen.

Content-ID: 32462

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

Ausgedruckt am: 26.11.2024 um 05:11 Uhr

Schirrmeister
Schirrmeister 16.05.2006 um 09:04:10 Uhr
Goto Top
Das meiste davon würde über extreme Umwege mittels for, findstr und wieder das Umleiten der Ausgabe in die neue Datei.
Das das 10x aufwendiger (und schwerer zu warten) ist, als einfach Perl oder dgl. zu nehmen sollte dir wohl klar sein.
Als Anhaltspunkte will ich dir da nur for, die verzögerte Erweiterung von Umgebungsvariablen und ggf. setlocal/endlocal nennen.
sl3
sl3 16.05.2006 um 12:27:02 Uhr
Goto Top
Danke. Ich habe zwar keine Ahnung von Perl und sonstigen Sachen, aber wenn es derartige Nachteile hat, das per Batchdatei zu machen, dann lasse ich das mal.
gogoflash
gogoflash 18.05.2006 um 02:02:05 Uhr
Goto Top
Hi,

ersetzen von einzelnen Stellen in Textdateien geht über SED/CAT/TR (alles Unixbefehle die es auch für Windows gibt)

@Schirrmeister: Ja mit den Windows Boardmitteln ist es schon schwierig. Aber mit ein paar nützlichen Tools geht dass schon. Nicht so schnell aufgeben. Wenn man Batchen möchte, geht alles .Frag mal den Batch Biber...


1. Stellen ersetzen:
sed "s/xyz/abc/g" <input.txt>output.txt

Ersetzt xyz gegen abc in der Datei input.txt und gibt das Ergebnis in output.txt aus.

sed "s/xyz/ /g" <input.txt>output.txt

Entfernt den String xyz und ersetzt ihn durch nichts face-smile

Zeilenumbrüche entfernen:

cat test.txt | tr -d "\n"

2. Alles ersetzen ??
echo Hallo hier bin ich > output.txt

Ersetzt den Inhalt von output.txt durch Hallo hier bin ich.

Aber das muss Du genauer erläutern.

3. Zeilen einfügen vor oder nach bestimmten Markern:
(Quelle:http://www.tu-harburg.de/rzt/tuinfo/oberflaechen/UNIX_Script/node52.htm ..)

(1) a\ text

Hinter jede gekennzeichnete Zeile wird text eingefügt.

(1) i\ text

Für die Funktion i\ (insert) gilt das gleiche wie für a mit dem Unterschied, daß text vor der gekennzeichneten Zeile eingefügt wird.


Beispiel: sed -f script_file bsp.f > xx
Inhalt von script_file:

/subroutine/ i\

C\
CUnterprogramm*\
C

(Die Befehlszeilen für sed in dem Beispiel werden hier nicht richtig dargestellt. Schau mal beim Link nach.)

Das Kommando bewirkt folgendes:
Die Datei bsp.f ist die Eingabedatei vom sed.
Vor (i) jede Zeile mit dem Textmuster subroutine werden
die obigen drei Kommentarzeilen geschrieben.
Der so veränderte Text wird in die Datei xx geschrieben.


Ein paar Infos:
http://de.wikipedia.org/wiki/Sed_%28Unix%29

SED/CAT/TR Download für Windows:
http://unxutils.sourceforge.net/

Ein paar Einzeiler:
http://sed.sourceforge.net/sed1line_de.html


Zumindest hast Du jetzt eine Anregung wie man den begrenzten Befehlssatz erweitern kann.

Gruß Miguel
Schirrmeister
Schirrmeister 18.05.2006 um 08:45:18 Uhr
Goto Top
@gogoflash

Er fragte explizit nach Batch, und so habe ich geantwortet!
Du kannst mir glauben, daß ich das auch mit Perl, C, C#, Java oder sonstwas erledigen kann, auch mit Batch würde ich das hinbekommen, ich sagte lediglich das es sehr aufwendig ist.
Ich bin sicherlich der letzte, der schnell aufgibt.
gogoflash
gogoflash 18.05.2006 um 15:52:18 Uhr
Goto Top
Hi,

so ganz einfach ist auch nicht mit sed und tr. Da diese den Zeilenumbruch anders interpretieren (eben Linux Tools).

Aber mit etwas liebe, kann man da schon was zusammenbacken.

Sollte ja nur ein Denkanstoss sein.


Gruß Miguel
Biber
Biber 18.05.2006 um 16:24:58 Uhr
Goto Top
Moin, sl3

schirrmeister und gogoflash haben es eigentlich schon erschöpfend behandelt, nur einen Aspekt noch will ich ergänzen.

Mit native Batch "eben mal schnell" spontane Search-and-Replace-Funktionen ausführen - geht, aber ist wirklich zu umständlich und zu aufwändig.
Mit den Skriptsprachen VBSkript/JSkript und natürlich auch KiX lässt sich vieles ergänzen, aber richtig flexibel und benutzerfreundlich wird es nicht so schnell.
Die Situationen, in denen ich dennoch diesen Weg gehen oder zumindest prüfen würde, sind die Massendatenverarbeitung und/oder die regelmäßig anliegende Dateiverarbeitung.

Beispiel:
Wenn ich aus 200 Dateien überall die 7te und die 15te Zeile löschen will und den String "Hans" durch den String "Wurst" ersetzen will

-oder-

Wenn ich täglich aus einer frisch erzeugten Logdatei die "relevanten" Informationen herausfiltere und diesen Extract an eine eigene AlleTage.log dranhänge (oder die Infos in eine Datenbank inserte), dann würde ich schon Batch nehmen. Allerdings auch angereichert mit Change/Replace-Utilities oder ganz auf eine der vielen Freeware-Sed's ausweichen.

Grüße (und danke an alle für diesen schönen Thread)
Biber

P.S.
@Schirrmeister
Ich bin sicherlich der letzte, der schnell aufgibt.
Der vorletzte... ich bin ja auch noch da.
sl3
sl3 19.05.2006 um 20:44:42 Uhr
Goto Top
Zunächst vielen Dank für eure zahlreichen und hilfreichen Antworten. Ich schau mir das mal genauer an. Scheint ja doch nicht so schwierig zu sein, dass es sich nicht lohnen würde, sich da mal ranzuwagen. Auch wenn es nicht direkt klappt, es hört sich so an, als ob man viel lernen kann, wenn man sich das mal genauer ansieht.

Zitat:
2. Alles ersetzen ?
echo Hallo hier bin ich > output.txt

Ersetzt den Inhalt von output.txt durch Hallo hier bin ich.

Aber das muss Du genauer erläutern.

Ja, dass das geht, ist mir schon klar. Aber es geht mir noch um was anderes. Z. B. in Notepad gibt es ja diese Alles Ersetzen- Funktion (Strg+ H). So etwas meine ich. Da kann man als Suchbegriff etwas eintragen, als Begriff zum Ersetzen etwas anderes und auf Alles ersetzen drücken, dann wird der jeweilige Begriff durch den anderen überall in der Datei ersetzt.
Mir geht es nicht um große Mengen an Dateien, sondern um automatische Funktionen zum Bearbeiten einer einzigen Datei.
Mal ein Beispiel: Das Kopieren eines Benutzerprofils unter Windows XP in ein anderes. Das Problem daran ist, dass eine Kopie mit Variablen wie %userprofile% nicht möglich ist, weil man das Benutzerprofil eines gerade angemeldeten Benutzers nicht kopieren und auch nicht überschreiben kann. Das heißt, es wird eine Batchdatei generiert, die den xcopy- Befehl vom einen zum anderen Benutzerprofil enthält. Dazu muss hinter den Befehl xcopy zunächst der Ausgangsordner geschrieben werden, also mit echo xcopy "%userprofile%">Pfad der Batchdatei.bat oder so ähnlich. Glücklicherweise wird bei diesem Befehl %userprofile% in den tatsächlichen Ordner umgewandelt. Anschließend müsste hintendran der Zielordner und die Parameter geschrieben werden. Dazu würde man theoretisch per runas in das andere Benutzerprofil gehen und den Befehl echo "%userprofile%">>Pfad der Batchdatei.bat ausführen. Nur dann ist der in der nächsten Zeile und der Zeilenumbruch müsste entfernt werden. Ausführung der Batchdatei ist kein Problem, dazu müsste man die Batchdatei als Systemdienst einrichten (weiß ich auch, wie das geht), so dass sie ausgeführt wird, wenn beide Benutzer gerade nicht angemeldet sind.
Das Problem ist jetzt nicht schlimm, da ich einen Weg gefunden habe, es zu umgehen (zunächst per xcopy das eine Benutzerprofil in einen vorher festgelegten Ordner kopieren, dann aus diesem Ordner mit einer weiteren Batchdatei weiter in das andere Benutzerprofil), es soll nur als Beispiel dienen.
Biber
Biber 19.05.2006 um 22:44:56 Uhr
Goto Top
Wie oben geschrieben, sl3,
machbar ist alles - nur mit einem passenden Werkzeug geht es halt schneller.

So, wie Du Deine Anforderung skizziert hast (von einem "fixen" Textfile aus geklonte Varianten erstellen), ist es schon prüfenswert, ob sich dafür nicht ein Batch zusammenschroten lässt.
Poste doch mal von der Muster-Vorlage die relevanten Zeilen (oder alles; werden ja keine 300 Zeilen sein) und die Soll-Variante.
Dann lässt sich doch abschätzen, ob das sinnvoller mit Batch oder VBS oder KiX oder whatever zu lösen ist oder ob wir da erst auf eine 128-Bit-Version von Windows warten müssen.

Gruß
Biber
sl3
sl3 19.05.2006 um 23:12:30 Uhr
Goto Top
Ja, die Datei im Ist- Zustand könnte ungefähr so aussehen:
xcopy "C:\Dokumente und Einstellungen\User1"
"C:\Dokumente und Einstellungen\User2" /Parameter
Soll- Zustand:
xcopy "C:\Dokumente und Einstellungen\User1" "C:\Dokumente und Einstellungen\User2" /Parameter
Biber
Biber 19.05.2006 um 23:33:03 Uhr
Goto Top
Na ja,
könnte lösbar sein...

::---snipp KlonVorlage.bat
@echo off & setlocal
type vorlage.txt
echo.
set /p Zeile1=<vorlage.txt
for /f "delims=" %%i in ('more +1 vorlage.txt') do set "Zeile2=%%i"  
echo Zeile1 Zeile2
echo %zeile1% %Zeile2%
::-snapp KlonVorlage.bat

Output:
Z:\>
$cmd$klonVorlage.bat
xcopy "C:\Dokumente und Einstellungen\User1"  
"C:\Dokumente und Einstellungen\User2" /Parameter  
Zeile1 Zeile2
xcopy "C:\Dokumente und Einstellungen\User1" "C:\Dokumente und Einstellungen\User2" /Parameter  
Grüße
Biber
sl3
sl3 20.05.2006 um 00:40:24 Uhr
Goto Top
Vielen Dank, ich habe die Batchdatei verstanden und sie hat funktioniert!
Du bist ein Super- User (bzw. Admin), fachlich höchst kompetent und immer hilfsbereit und nett, ich war ja schon vor meiner Anmeldung öfter in diesem Forum, daher weiß ich das...
90957
90957 01.06.2010 um 12:42:01 Uhr
Goto Top
Hey,
ich weiß ich schreib hier in einen uralten Thread, aber meist sind doch neue nicht erwünscht ...
Ich habe ein anderes Problem, was sich aber mit fast der gleichen Lösung beheben lassen würde ...
Ich arbeite selber sehr gerne mit Batch aber bei dem FOR verstehe ich das "('more +1 vorlage.txt')"
aus der Zeile:
for /f "delims=" %%i in ('more +1 vorlage.txt') do set "Zeile2=%%i"
nicht.
Was sind diese halben Anführungsstrich, und was ist "more+1 "?
Die Windows CMD Hilfe hat mir dazu nichts sagen können ... (for /?)
Ich würde mich sehr über eine Kurzerklärung oder einen Link freuen ...

Gruß
BluBb_mADe
Biber
Biber 01.06.2010 um 13:20:14 Uhr
Goto Top
Moin BluBb-mADe,

willkommen im Forum.
Zitat von @90957:
Hey,
ich weiß ich schreib hier in einen uralten Thread, ..
Mein seliger Onkel Heinz-Dieter war auch nekrophil....
...aber meist sind doch neue nicht erwünscht ...
Öhmm... jetzt rein statistisch oder mehr gefühlt.... oder geraten....?

... bei dem FOR verstehe ich das "('more +1 vorlage.txt')"
aus der Zeile:
for /f "delims=" %%i in ('more +1 vorlage.txt') do set "Zeile2=%%i"
nicht.
Was sind diese halben Anführungsstrich, und was ist "more+1 "?

Dir FOR/F-Anweisung erwartet eine (unformatierte/Plain-Text-)Datei als zu verarbeitenden Input.
Daher kommt ja auch das "/F" im "For /F .... vom neudeutschen Wort "File" (weil da file Zeilen drin sind).

Es muss aber nicht ein existierendes File (aus dem Dateisystem), sondern darf auch die Bildschirmausgabe eines ausgeführten Befehls sein.
Wesentlich ist nur, dass zu dieser -aus Sicht der FOR/F-Anweisung -Einlese-Quelle ein geöffnetes File-Handle existiert.

Steht also innerhalb der Klammer weder
  • (a) ein Dateiname
  • (b) oder ein in doppelten Anführungszeichen vorgegebener Text
  • sondern (c) etwas in einfachen Anführungszeichen

> dann wird dieser Fall (c) interpretiert als "alles innerhalb der einfachen Anführungszeichen ist ein von der CMD.exe ausführbarer/aufrufbarer Befehl".

In diesem Fall wird also der Befehl "more +1 vorlage.txt" ausgeführt, gleichbedeutend mit
"Zeige mir seitenweise die Datei vorlage.txt an (aber überspringe die erste Zeile)"
Okay, wenn du es am CMD-Prompt direkt aufrufst und die Datei Vorlage.txt ein paar 100 Zeilen lang ist, dann würde der "more"-Befehl auch nach jeder Bildschirmseite anhalten und auf die Homer-Simpson-Taste warten.
Bei einer Ausgabe an ein offenes Filehandle allerdings ist die Seitenlänge nahe unendlich, "blättern" wird also der "more"-Befehl in einer FOR/F-Anweisung eher selten.

Ein oder zwei andere Beispiele zu FOR/F-Anweisungen findest du auch im Bereich "Batch & Shell".hier im Forum.

Grüße
Biber
90957
90957 01.06.2010 um 13:31:36 Uhr
Goto Top
aahhhh....
Das "Filehandle" kannte ich gar nicht.
Das eröffnet ja so einige Möglichkeiten!

Auf das mit dem more hätte ich auch eigentlich selber kommen können ...
Vielen dank!
Du hast mir sehr geholfen...
Und dann auch noch soo schnell!

Ich hab bis jetzt hier im Forum nur Beiträge (meist von dir) gefunden, die meine Fragen schon beantwortet haben
und deshalb wurde eine Anmeldung bis jetzt einfach nie nötig ;D ...
DerKaiserFranz
DerKaiserFranz 05.09.2014 um 18:07:35 Uhr
Goto Top
Hallo Biber,

2010 ist lange her, aber ich versuchts mal mit dem alten Thread. Ich habe eine Aufgabe an der ich scheitere. Folgende Situation:

Wir bekommen laufend per ftp Dateien mit der Namenskonvention Sendungsnummer.txt geschickt. Diese sind in der Struktur immer gleich aufgebaut, haben aber unterschliedliche Namen. Innerhalb dieser Dateien steht immer an der gleichen Stelle die Zeichenfolge A00STD. Diese muss ich nach A00ABH umbenennen. Der Dateiname soll sich dabei nicht ändern. Nach der Bearbeitung müssen die Dateien dann in ein andere Verzeichnis verschoben werden. Von dort aus werden sie dann den nachgelagerten System übergeben.

Ich habe den ganzen Tag Codes aus dem Internet durchforstet und versucht, mir die Vorgehendsweisen zu erschließen. Aber leider komme ich wie gesagt nicht weiter. Ich würde das gerne per Batch lösen und kein separates Programm installieren, sonst muss ich mir wieder eine Freigabe der IT holen und ich versteh ja auch, dass die das nicht wollen.

Gibt es hier eine Möglichkeit?
90957
90957 06.09.2014 aktualisiert um 05:00:02 Uhr
Goto Top
Hey,
ich bin zwar nicht Biber, aber ich kann dir trotz dem sagen dass das Problemlos möglich ist.
Aber ich denke es wäre sinnvoll nächstes mal einen neuen Thread zu erstellen.
So kann ja niemand deine Frage finden.
Es klingt als wäre der einfachste Weg die Textdatei zeilenweise durchzugehen und jede Zeile nach
diesem String zu durchsuchen und dabei neu zu schreiben.

Das hier z.B. sollte pi mal Daumen tun was du dir vorstellst.
Einfach deine txt per drag'n'drop da drauf.

batch code:
@echo off && setlocal enabledelayedexpansion
for /F "tokens=1* delims=" %%f in ('type "%1"') do (  
    set "out=%%f"  
    set "out=!out:A00STD=A00ABH!"  
    echo[!out!>>"%~n1.changed.txt"  
)
::del "%1" 

(Vorsicht, das Script entfernt auf Grund der funktionsweise der For-Schleife Leerzeilen. Dafür gibt es sicher ein Workaround, aber mir fällt gerade nix ein.)
Falls du noch Hilfe bei den Zielpfaden/Dateinamen o.ä. sag einfach Bescheid. Vieleicht kann ich ja helfen.
(Auch ein Ersetzen in einer spezifischen Zeile sollte mit geringem Mehraufwand möglich sein.)
DerKaiserFranz
DerKaiserFranz 08.09.2014 aktualisiert um 15:18:10 Uhr
Goto Top
Hi,

super. Das klappt schonmal ganz gut. Um es für meine Kollegen nutzbar zu machen, wären noch ein paar Änderungen hilfreich

1. Der Dateiname sollte erhalten bleiben. Ich habe das jetzt so gelöst, dass der neue Dateiname eine andere Endung bekommt, hier .txt. Am Ende des Scripts benenne ich denn den kompletten Inhalt des Ordners von *.txt nach *.for um. Das ist sicherlich nicht ganz sauber, aber geht erstmal. Wenn du noch eine bessere Lösung hast ... immer gerne.

2. Wichtig wäre mir, dass ich das ganze per geplanten Task aufgrufen kann. Dieser sollte dann die Batch-Datei aufrufen, die dann wiederum im Verzeichnis mit den umzubenennenden Dateien eine nach der anderen abarbeitet.

Zwei Dinge sind mir noch aufgefallen, die ich nicht lösen kann:

3. ich habe natürlich einges herumprobiert und dabei auch Fehler gemacht. Und nach einer nicht erfolgreichen Ausführung geht es beim nächsten mal grundsätzlich nicht. Da sucht er dann die Datei aus dem vorherigen Versuch, die es aber u.U. gar nicht mehr gibt. Benne ich die dann wie gewünscht um, läuft das Script und auch beim nächsten mal wieder. Ist sicherlich nicht all zu hoch zu bewerten, da es nach der Probier-Phase zu keinen Fehlermeldungen mehr kommen sollte. Dennoch ein ungutes Gefühl.

4. sehr seltsam, und das mausert sich zu einem großen Problem, ist, dass das Script lokal und am Terminalserver unterschiedliche Verhalten zeigt. Lokal haut es hin, aber am Temrinalserver verschwindet die Originaldatei OHNE dass es eine neue gibt. Woran kann denn nun das wieder liegen?
* UPDATE: Punkt 4 ist gelöst. Warum auch immer muss ich am TS explizit angeben, wo ich die Datei erstellt haben möchte. Das ist standardmäßig nicht das Verzeichnis, in dem der Batch ausgeführt wird! Mit exakten Pfadangaben funktioniert das aber wieder wie gewohnt. *

So sieht der Code nun aktuell aus:

@echo off && setlocal enabledelayedexpansion
for /F "tokens=1* delims=" %%f in ('type "%1"') do (
set "out=%%f"
set "out=!out:A00STD=A00ABH!"
echo[!out!>>"%~n1.txt"
)
del "%1"
ren "*.txt" "*.178"

Gib'ts zu den Punkten Ideen?
90957
90957 08.09.2014 um 15:26:54 Uhr
Goto Top
Sollte alles machbar sein.
Was den Terminalserver angeht... da hab ich leider keine Ahnung.
Ich würde mal raten dass es an %~n1 oder an type "%1" liegt... aber wirklich nur geraten.
(Vieleicht sind es auch irgendwelche systeminternen Sicherheitsrichtlinien.)

Noch mal zusammengefasst:
Das Script wird in einem festen Interval ausgeführt,
soll alle txt Dateien in einem bestimmten Ordner korrigieren
und danach in einen anderen bestimmten verschieben.
Richtig?
DerKaiserFranz
DerKaiserFranz 08.09.2014 um 19:14:20 Uhr
Goto Top
Wie gesagt ist das Thema mit dem TS geklärt.

Die Zusammenfassung ist im Grunde richtig. Leicht abgewandelt soll der Ablauf wie folgt sein:

1. Dateien werden per ftp eingelagert
2. Script wird per geplantem Task ausgeführt, z.B. minütlich
3. Das Script arbeitet alle Dateien ab, die in dem Empfangs-Ordner liegen. Im Script würde ich das so hinterlegen, dass die neuen Dateien gleich im Zielordner erzeugt werden, dann spart man sich das verschieben und umbenennen.
4. Die ursprüngliche Datei kann dann gelöscht werden.

Bei 1 und 2 weiß ich, was zu tun ist. Bei 3 und 4 komme ich nicht weiter.
DerKaiserFranz
DerKaiserFranz 12.09.2014 um 03:37:49 Uhr
Goto Top
Jetzt wird's bunt. Bevor wir das mit dem Abarbeiten der Dateien klären, gibt es eine weitere, unerwartete Baustelle. Folgender Ausschnitt aus einer Musterdatei

G0000100340422549926090665 0000050001 usw, usw, usw
G99001O NNJNN178743743980 NI 11316089
H000015047618900 112 50311316089

Ziel ist es jetzt, in der Zeile, die mit H00 beginnt, die Zeichenfolge 503 zu finden. Die nach 503 folgenden 35 Zeichen müssen in die Zwischenablage bzw. eine Variable gespeichert werden. Mit dem Inhalt müssen wir in die Zeile, die mit G00 beginnt gehen. Dort soll dann der Inhalt der Zwischenablage ab Zeichen 7 einkopiert werden. Der alte Wert darf in H00 stehen bleiben, mit dem müssen wir nichts weiter machen. Der obige Datensatz würde dann so aussehen:

G0000111316089 0000050001 usw, usw, usw
G99001O NNJNN178743743980 NI 11316089
H000015047618900 112 50311316089

Leider werden beim Posten die Leerzeichen herausgelöscht. Ich hoffe, dass das dennoch verständlich geschrieben ist.

Ist das auch zu bewerkstelligen?

Lieben Dank vorab.
N3urol3ptic
N3urol3ptic 22.04.2017 aktualisiert um 09:35:06 Uhr
Goto Top
Moin an alle...

Ich habe eine Frage, und zwar arbeite ich mit der Cryengine als Modder, ich habe hier knapp 300-400 .mtl Dateien(Textdateien mit der Endung .mtl). In diesen .mtl Dateien sind knapp 400 einträge mit der Endung .jpg (hier ein kleines Beispiel).

  1. 3ds Max Wavefront OBJ Exporter v0.97b - (c)2007 guruware
  2. File Created: 18.01.2013 11:24:44

newmtl street
Ns 10.0000
Ni 1.5000
d 1.0000
Tr 0.0000
Tf 1.0000 1.0000 1.0000
illum 2
Ka 0.5880 0.5880 0.5880
Kd 0.5880 0.5880 0.5880
Ks 0.0990 0.0990 0.0990
Ke 0.0000 0.0000 0.0000
map_Ka tex\street_diffuse.jpg
map_Kd tex\street_diffuse.jpg
map_Ks tex\street_specular.jpg
map_Ke tex\street_illumination.jpg

newmtl sidewalk2
Ns 10.0000
Ni 1.5000
d 1.0000
Tr 0.0000
Tf 1.0000 1.0000 1.0000
illum 2
Ka 0.5880 0.5880 0.5880
Kd 0.5880 0.5880 0.5880
Ks 0.1080 0.1080 0.1080
Ke 0.0000 0.0000 0.0000
map_Ka tex\street_layout_01_diffuse.jpg
map_Kd tex\street_layout_01_diffuse.jpg
map_Ks tex\street_layout_01_specular.jpg
map_Ke tex\street_sidewalk_illumination.jpg

Ich muss alle Endungen von .jpg in die Endung .dds umschreiben in der .mtl Datei (Das sind in jeder Datei ungefähr bis 400 Stück)
damit es nachher so aussieht(hier ein Beispiel)

Von:
map_Ka tex\street_layout_01_diffuse.jpg
map_Kd tex\street_layout_01_diffuse.jpg
map_Ks tex\street_layout_01_specular.jpg
map_Ke tex\street_sidewalk_illumination.jpg

zu:
map_Ka tex\street_layout_01_diffuse.dds
map_Kd tex\street_layout_01_diffuse.dds
map_Ks tex\street_layout_01_specular.dds
map_Ke tex\street_sidewalk_illumination.dds

was muss ich in eine Batch Datei schreiben das er zb alle .mtl Dateien in einem Ordner abändert,(Ich würde dann immer die .mtl dateien in einen Ordner kopieren, und auf Batch drücken) ich muss das sonst alles peer Hand machen, und das wären knapp 160000 Einträge, und das ist einfach nicht zu schaffen. Ich habe schon 6 Stunden lang gegoogelt, und bin nicht fündig geworden, dann bin ich über diesen Thread hier gestolpert, und ich habe wieder ein bisschen Hoffnung verspürt. Es ist nur eine Frage, wenn das zu viel Arbeit ist das zu schreiben dann müsst ihr mir nicht helfen, wie schon gesagt, es ist nur eine Frage, oder Bitte... Ich bedanke mich schonmal im voraus bei euch. Liebe Grüße face-smile


PS: Mein System ist Windows
Schirrmeister
Schirrmeister 22.04.2017 um 10:13:30 Uhr
Goto Top
Moin,

benutz dafür einfach grepwin, das lässt dich in Dateien/Verzeichnissen Suchen und Ersetzen.
Die zu bearbeitenden Dateien können auch gut gefiltert werden.

https://sourceforge.net/projects/grepwin/
132895
132895 22.04.2017 aktualisiert um 11:50:10 Uhr
Goto Top
@echo off
set "folder=c:\Data"  
powershell -Ex Bypass -Noprofile -C "gci '%folder%' -Filter *.mtl -Recurse | %%{(gc $_.Fullname) -replace '\.jpg','.mtl' | sc $_.Fullname -Force}"  
Gruß
manu69123
manu69123 22.01.2019 um 18:03:02 Uhr
Goto Top
Hi Leute. ich bin seit Wochen auf der suche nach einer Lösung gewesen welche ihr genau hier besprochen habt.

ich habe einen Datensatz welcher aus 300k Seriennummern besteht. Die Datei ist eine .txt und wird einfach per Endung geändert in eine .mtr. Nun ist das Problem das wir zuvor die Eingabe per Hand erledigt haben. Wir stellen gerade um auf Barcode und haben Festgestellt das der aktuelle Barcode anstatt "1000001BGV000011111" (Muster) "bgv0000011111" lautet. Da wir nun mega Probleme haben kam ich auf die Idee mit der batch Datei.


TR MKRO 9000 0 22.01.2019 17:12:47

[001]
5000010774=[F5000010774,"FBosch Krankenhaus",F2,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,F0,F0000#,F0000#,F0000#,F%N-00#,F0000#,F0000#,F1,N,N,N,N,N,N,N,N,N,N,N,N,N,F-1,"F14.03.2016 08:31:03",N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N]

[002]
5000010774=[F5000010774,F11,F0,F0]

[005]
-1=[F-1,FUnbekannt,F,N,F,F,F,F,F,F,F,F,N,F,F,F,F,"B{\rtf1\ansi\ansicpg1252\deff0\deftab720{\fonttbl{\f0\fswiss MS Sans Serif;}{\f1\froman\fcharset2 Symbol;}{\f2\fswiss\fcharset1 MS Sans Serif;}{\f3\fswiss\fprq2 System;}{\f4\fswiss\fprq2 MS Sans Serif;}{\f5\fswiss\fprq2 Arial;}}.+{\colortbl\red0\green0\blue0;\red255\green0\blue0;}.+\deflang1031\pard\plain\f5\fs40\cf1\b Datensatz bitte nicht \'e4ndern !!!\plain\f2\fs16 .+\par }.+!!!!!!!!!!!!!!!!",N,N,F0,"F30.09.2003 14:39:18",N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N]

[007]
5000013594=[F5000013594,F1,F0,N,F0,F0,F0,Fkgl,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N]

[008]
5000391800=[F5000391800,F1,F5000013594,F-1,"Fikp,2og,labor,206,2286",F0,N,N,N,N,F1,F0,F0,F0,F0,F0,F0,F0,F0,F0,F0,F0,F0,F0,F0,F0,F1,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,F0,F0,N,N,N,N,N,N,F0,F0,N,N,N,N,N,N,N,N,N,N,F-1,F0,N,N,N,N,F0,F0,F-,F-1,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,F0,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,F3,F0,F1,F3,F6,F12,F24,F48,F60,F2,F2,F2,F2,F2,F2,F2,F2,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,F0,F0,F0,F0,F0,F0,F0,F0,F0,F0,F0,F0,F0,F0,F0,F0,F0,F0,F0,F0,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N]

[009]
5000400616=[F5000400616,F1,N,N,F5000010774,F5000391800,N,N,Fbgv000002286,N,N,F___,N,F0,N,N,N,F0,N,F5000400615,F5000400615,F5000400615,F3,N,F18.01.2019,F18.01.2019,F18.01.2019,F18.01.2019,F3,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,F1,F0,F0,F0,F0,F0,F0,F0,F0,F0,F0,F0,F0,F0,F0,F0,F0,F0,F0,F0,F0,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N]

[017]
5000400615=

[024]
5000400615=[F5000400615,F5000400616,N,N,N,N,N,N,N,Fbgv000002286-000,N,N,"FManuel Ewald",F10000001,"FDIN VDE 0701-0702",F18.01.2019,F18.01.2019,N,F0,N,N,N,N,"FGOSSEN METRAWATT",N,N,N,N,N,N,N,"FSECUTEST S2N+",N,N,N,N,N,N,N,FCH5787690008,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,F0,F0,F0,N,F0,N,N,N,N,N,N,N,N,N,N,F-1,"F22.01.2019 10:30:36",N,N,N,N,N,N,N,N,N,N,FDESKTOP-4KC0I9I,FSYSDBA,"FWISAG Elektrotechnik Süd-West GmbH & Co. KG","FWISAG Elektrotechnik Süd-West GmbH & Co. KG","FRuppmannstraße 33c",F70565,FStuttgart,Fdep-bxu-nms,N,N,N,N,N,N,N,N,N,N]

[026]
5000400598=[F5000400598,F5000400615,F1,F-1,"FSICHT PSI","FSichtprüfung: Schutzleiter",N,N,N,N]
5000400600=[F5000400600,F5000400615,F2,F-1,"FSICHT PSI","FSichtprüfung: Isolierteile",N,N,N,N]
5000400602=[F5000400602,F5000400615,F3,F-1,"FSICHT PSI","FSichtprüfung: Gehäuse",N,N,N,N]
5000400604=[F5000400604,F5000400615,F4,F-1,"FSICHT PSI","FSichtprüfung: Anschlussleitung",N,N,N,N]
5000400606=[F5000400606,F5000400615,F5,F-1,"FSICHT PSI","FSichtprüfung: Typenschild",N,N,N,N]
5000400608=[F5000400608,F5000400615,F6,F-1,"FSICHT PSI","FSichtprüfung: unsachgemäßer Gebrauch",N,N,N,N]
5000400610=[F5000400610,F5000400615,F7,F-1,"Fi PSI Rpe",FSchutzleiterwiderstand,N,N,N,N]
5000400612=[F5000400612,F5000400615,F8,F-1,"Fi PSI Riso",FIsolationswiderstand,N,N,N,N]
5000400614=[F5000400614,F5000400615,F9,F-1,"Fi PSI Uiso","FMessspannung für Isolationswiderstand",N,N,N,N]

[027]
5000400615=[5000400598,5000400600,5000400602,5000400604,5000400606,5000400608,5000400610,5000400612,5000400614]

[028]
5000400597=[F5000400597,F5000400598,F1,"FIst der Schutzleiter in Ordnung?",N,F1,N,F2,N,N,N,F1,N,N,F2,N]
5000400599=[F5000400599,F5000400600,F1,"FSind Isolierteile in Ordnung?",N,F1,N,F2,N,N,N,F1,N,N,F2,N]
5000400601=[F5000400601,F5000400602,F1,"FIst das Gehäuse in Ordnung?",N,F1,N,F2,N,N,N,F1,N,N,F2,N]
5000400603=[F5000400603,F5000400604,F1,"FIst die Anschlussleitung in Ordnung?",N,F1,N,F2,N,N,N,F1,N,N,F2,N]
5000400605=[F5000400605,F5000400606,F1,"FIst das Typenschild in Ordnung?",N,F1,N,F2,N,N,N,F1,N,N,F2,N]
5000400607=[F5000400607,F5000400608,F1,"FSind keine Anzeichen für unsachgemäßen Gebrauch vorhanden?",N,F1,N,F2,N,N,N,F1,N,N,F2,N]
5000400609=[F5000400609,F5000400610,F1,N,FOhm,F0.300000011920929,N,F0,F,F4,F3,F0.187999993562698,N,N,F2,N]
5000400611=[F5000400611,F5000400612,F1,N,FMOhm,N,F1,F0,F>,F4,F1,F310,N,N,F2,N]
5000400613=[F5000400613,F5000400614,F1,N,FV,F500,F500,F0,F,F4,F0,F525,N,N,F1,N]


Ich muss aus diesem text das "(bgv)0000011111" filtern und ersetzen durch "1000001"
Dieser Text wiederholt sich in dieser einen Datei ca 300.000 mal.

Kann mir da bitte irgendjemand helfen. Mfg manu