modde88
Goto Top

Dateinamen auslesen und in selbige Datei einfügen

Die Dateien (es sind mehrere) heißen z.b. g2xpl_4_16_34228_42992.ter, können aber mit dem Windows Editor geöffnet werden, da steht dann folgendes:
A
800
TERRAIN

BASE_TEX_NOWRAP ../textures/g2xpl_4_16_34228_42992.dds


Wie man sieht wird der Dateiname wieder als .dds benutzt.
Problem ist das die Dateinamen bei allen Dateien richtig sind, aber der Inhalt sieht bei einigen wie folgt aus:
A
800
TERRAIN

BASE_TEX_NOWRAP ../textures/empty.dds

Nun soll statt der empty.dds der dateiname eingefügt werden, also z.b. g2xpl_4_16_34228_42992.ter, aber statt der Endung .ter soll .dds stehen.

Das ganze soll automatisch ablaufen, also alle Dateinamen nehmen und so einfügen.

Ist das möglich? Ich hab rumgesucht, aber bin einfach nicht durchgestiegen wie ich das machen könnte.

Wäre super wenn mir jemand ein Beispiel geben könnte wie ich sowas angehen kann face-smile


Grüße vom Neuling MoDDe face-smile

Content-Key: 84473

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

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

Member: bastla
bastla Apr 01, 2008 at 19:27:43 (UTC)
Goto Top
Hallo MoDDe88 und willkommen im Forum!

Besteht der gesamte Dateiinhalt nur aus den angegebenen 4 Zeilen (bzw geht es immer nur um eine Zeile, oder kann es mehrere zu prüfende / zu verändernde Zeilen geben)?

Beginnt die fragliche Zeile immer mit "BASE_TEX_NOWRAP../textures/" und dahinter folgt (oder auch nicht) der Name?

Ist vorrangig zu prüfen, ob der Dateiname nicht enthalten ist, oder soll eher nach "empty.dds" gesucht werden?

Der erste Schrit (Überprüfung der Dateien) könnte (allerdings ungetestet), abhängig von der Antwort auf die letzte Frage, auf eine der beiden folgenden Arten vorgenommen werden:
for /f "delims=" %%i in (*.ter) do findstr "%%~ni.dds" "%%i">nul||@echo Fehlerhaft: %%i  
bzw
findstr /m "empty.dds" *.ter  

Noch eine Frage: Darf es nur Batch sein, oder wären VBS oder ein Utility wie "sed" auch für Dich ok?

Grüße
bastla
Member: MoDDe88
MoDDe88 Apr 01, 2008 at 19:40:26 (UTC)
Goto Top
Also jede Datei hat den selben Inhalt, haargenau gleich, nur eben entweder empty.dds oder g2xpl_x_x_xxxx_xxxxx.dds wobei x für verschieden Zahlen stehen (0-9).
Die fragliche Zeile beginnt immer mit "BASE_TEX_NOWRAP.. /textures/g2xpl_x_xx_xxxx_xxxx.dds
und es gibt immer nur diese 4 zeilen (eigentlich 5, da eine ja leer ist).

Wo empty.dds drin steht weiß ich schon, ab einer bestimmten Uhrzeit hat das programme alle Dateien mit empty.dds versehen, wo eigentlich die Zahlen reinsollen, es geht eher um das ersetzen da es sich um knapp 1000 Dateien handelt, und das von hand zu machen wird schwierig :D

Mir ist alles recht face-smile, vobei ich Batch bevorzugen würde, da es anscheinend eine einfache und leicht zu erlernende sprache ist, und ich schon den ganzen Abend versuche es selber damit hinzu bekommen und gerne die Lösung dafür sehen würde face-smile. Aber Ziel sollte es sein das Problem zu lösen, deshalb verzichte ich auch gerne auf Batch um die sache zu lösen face-smile
Aber muss dazu sagen das ich Windows Vista habe.

Danke aber schon im vorraus
Member: bastla
bastla Apr 01, 2008 at 20:26:52 (UTC)
Goto Top
Hallo MoDDe88!

Ein echtes Ersetzen ist mit Batch kaum möglich, daher folgender Ansatz:
@echo off & setlocal
cd /d "D:\Ordner mit ter-Dateien"  

set "empty=empty.dds"  
set "Praefix=BASE_TEX_NOWRAP ../textures/"  

for /f "delims=" %%i in ('findstr /m "%empty%" *.ter') do (  
	findstr /v "%empty%" "%%i">"%%~ni.bak"  
	echo %Praefix%%%~ni.dds>>"%%~ni.bak"  
	move "%%~ni.bak" "%%i"  
)
Bitte in der zweiten Zeile den entsprechenden Ordner festlegen.
Zur Funktionsweise:

Zunächst wird mit "cd /d" in den Ordner der ".ter"-Dateien gewechselt - dadurch kann im weiteren Ablauf der Pfad vernachlässigt werden.

Wie vorhin schon gezeigt, kann mit "findstr" eine Liste der zu bearbeitenden Dateien erzeugt werden. Diese Dateien werden durch die "for"-Schleife der Reihe nach abgearbeitet.

Da aufgrund Deiner Beschreibung die relevante Zeile als letzte in der Datei steht, können zunächst alle vorhergehenden Zeilen (diese enthalten den Suchbegriff "empty.dds" nicht) beibehalten = in eine neue Datei (mit dem gleichen Namen, aber dem Typ ".bak") geschrieben werden.

Für die letzte Zeile ist der erste Teil (%Praefix%) vorgegeben und muss nur noch um den Dateinamen (ohne Typ) + ".dds" ergänzt und ebenfalls in die ".bak"-Datei geschrieben werden.

Als letzter Schritt wird per "move" die ursprüngliche Datei durch die neue Datei ersetzt.
Das Ganze sollte eigentlich funktionieren (zumindest tut's das bei mir unter XP), trotzdem bitte nicht mit den Originaldateien testen.

Ein letzter Hinweis: Die letzte Zeile wird mit CR/LF abgeschlossen (ist bei Verwendung von native Batch eigentlich nicht anders möglich).

Grüße
bastla
Member: MoDDe88
MoDDe88 Apr 01, 2008 at 20:39:53 (UTC)
Goto Top
Tausend Dank, also darauf wäre ich nieee gekommen. Vielen Vielen Dank ! Hast mir den Abend gerettet, danke auch für die ausführliche Erklärung, so konnte ich auch gleich noch was lernen, danke dir face-smile

PS: Super Forum, macht euren Job echt gut face-smile

Grüße MoDDe
Member: Biber
Biber Apr 01, 2008 at 21:05:08 (UTC)
Goto Top
Fussnote dazu:

es geht natürlich auch als Einzeiler am CMD-Prompt ....
....allerdings ist vorher ein mode con cols=195 lines=44 angebracht...

Aber die Fussnote bezog sich auf das hier...
...wird mit CR/LF abgeschlossen (ist bei Verwendung von native Batch eigentlich nicht anders möglich).
... stimmt... eigentlich.... face-wink
:: -----------snipp EchoWithoutCRLF.CMD
:: Kleiner Trick für z.B. Laufbalken-Mimik im Batch
@echo off & setlocal & set file="%temp%\VonBiber.Mfg"  
echo\>"%temp%\ret"  
:: Zur Demo einmal auf den Bildschirm (con:) und einmal in eine Datei...
For %%i in (con: %file%) do call:NoCRLFDemo %%i
del "%temp%\ret"  
echo\
type %file%
pause
For /l %%i in (1,1,7) do type %file%
del %file%
goto :eof

:NoCRLFDemo
Set /p=Schönen Gruß <"%temp%\ret">%1  
Set /p=von Biber, <"%temp%\ret">>%1  
:: Zwischen den SET/P's  könnten natürlich auch andere Batch-Befehle stehen... 
Set /p=der auch ohne CRLF ein ECHO machen kann, <"%temp%\ret">>%1  
::-----------snapp EchoWithoutCRLF.CMD
Output:
(=23:07:18  D:\temp=)
>e:\Schnipsel\EchoWithoutCRLF.cmd
Schönen Gruß von Biber, der auch ohne CRLF ein ECHO machen kann,
Schönen Gruß von Biber, der auch ohne CRLF ein ECHO machen kann, Drücken Sie eine beliebige Taste . . .
Schönen Gruß von Biber, der auch ohne CRLF ein ECHO machen kann, Schönen Gruß von Biber, der auch ohne CRLF ein
ECHO machen kann, Schönen Gruß von Biber, der auch ohne CRLF ein ECHO machen kann, Schönen Gruß von Biber, der a
uch ohne CRLF ein ECHO machen kann, Schönen Gruß von Biber, der auch ohne CRLF ein ECHO machen kann, Schönen Gruß vo
n Biber, der auch ohne CRLF ein ECHO machen kann, Schönen Gruß von Biber, der auch ohne CRLF ein ECHO machen kan
n, Schönen Gruß von Biber, der auch ohne CRLF ein ECHO machen kann,
(=23:07:21  D:\temp=)
Grüße
Biber
[Edit] Variable %file% ergänzt zur Lesbarkeit. [/Edit]
Member: bastla
bastla Apr 01, 2008 at 21:22:22 (UTC)
Goto Top
@Biber

... drum stand (bzw steht) da ja auch ... eigentlich ... face-wink

Grüße
bastla
Member: geTuemII
geTuemII Apr 02, 2008 at 09:31:00 (UTC)
Goto Top
@Biber & bastla:
Ein Kampf der Giganten --> hybsch face-smile

Grinsend,
das geTuemII
Member: bastla
bastla Apr 02, 2008 at 09:40:48 (UTC)
Goto Top
@geTuemII!

Aber geh', wieso denn Kampf?

(Die Bezeichnung als "Gigant" möchte ich mir übrigens auf's Entschiedenste verbitten - nur wegen der 2,5 kg, die ich in der Fastenzeit zugelegt habe, musst Du mich nicht gleich so beleidigen ... face-wink)

Grüße
bastla
Member: Biber
Biber Apr 02, 2008 at 10:11:16 (UTC)
Goto Top
@bastla
nur wegen der 2,5 kg, die ich in der Fastenzeit zugelegt habe...
Ach, nimm's leicht....

for /L %i in (1,1,33) do @echo\|set /P=hi

Gruße
Biber
Member: geTuemII
geTuemII Apr 02, 2008 at 10:25:18 (UTC)
Goto Top
@bastla:
Ich sprach doch von unseren Batch-Giganten, menno! Wenn ihr beiden euch in Feinheiten ergeht, hat das schon was von "Kampf der Giganten" face-wink
Das mit der Fastenzeit hast du aber trotzdem irgendwie falsch verstanden, oder?

@Biber:
Hat dir schon mal jemand gesagt, daß du ein olles Lästermaul bist? <beiseite> Und dann verbätschelt der das auch noch....</>

geTuemII face-smile
Member: bastla
bastla Apr 02, 2008 at 10:35:46 (UTC)
Goto Top
@geTuemII

Und dann verbätschelt der das auch noch ...
... aber wenigstens schön gelöst - und hinsichtlich des Off Topic völlig On Topic. face-wink

Das mit der Fastenzeit hast du aber trotzdem irgendwie falsch verstanden, oder?
Keineswegs - was meinst Du wohl, wieviel es ohne Fastenzeit geworden wäre ...

Grüße
bastla
Member: Biber
Biber Apr 02, 2008 at 10:50:07 (UTC)
Goto Top
@fastenzeit
Hat dieses Fasten etaws mit "Fasten seat belt" zu tun?
... das war doch auch was mit "Sitzring" oder so...??

Grüße
Biber
P.S. "Fasten seat belt".... ob die das wohl schnallen? *g
Member: bastla
bastla Apr 02, 2008 at 10:59:02 (UTC)
Goto Top
@Biber
ob die das wohl schnallen? *g
Also ich hab' da keine Chance - die Schnalle erreiche ich leider nicht ... face-wink

Grüße
bastla
Member: geTuemII
geTuemII Apr 02, 2008 at 13:15:49 (UTC)
Goto Top
Ohmann, da kommt MoDDe88 neu in das Forum, und dann bekommt er gleich so einen Thread ab. Was soll der denn von uns denken?

Etwas besorgt,
geTuemII
Member: MoDDe88
MoDDe88 Apr 02, 2008 at 13:19:41 (UTC)
Goto Top
Alsooo ich hab ein weiteres Problem, ich hab nun rausgefunden das ich die Dateinamen aus einem anderen Ordner verwenden muss, damit das alles klappt.

Ordner Struktur:

D:
Verzeichnis 1
Verzeichnis 2

In Verzeichnis 1 sind die Dateien drin, von denen ich den Dateinamen brauch, dann soll die Batch datei diese in Verzeichnis 2 in die richtige Datei einfügen, problem ist aber das die Dateien in Verzeichnis 1 z.b. g2xpl_4_16_34228_42992_LOW.ter heißen, nun möchte ich das dieser Dateiname genommen wird (g2xpl_4_16_34228_42992_LOW) und in die Datei in Verzeichnis 2 eingefügt wird wie oben, nur heißt in verzeichnis 2 die Datei nicht g2xpl_4_16_34228_42992_LOW.ter sondern g2xpl_4_16_34228_42992.ter

Ich hoffe ihr habt verstanden was ich meine.
Dateinamen aus Verzeichnis 1 und in Datei in Verzeichnis 2 einfügen wie oben schon gelöst.

Bitte helft mir, sonst müsste ich die 10.000 Dateien von hand machen ^^

Grüße modde
Member: Biber
Biber Apr 02, 2008 at 13:35:10 (UTC)
Goto Top
Moin moDDe88,

wäre es dann nicht einfacher, die Datei(en) im Zielverzeichnis jeweils komplett neu zu schreiben (mit den ersten 4 fixen Zeilen und der einen variablen Endzeile)?

Grüße
Biber
Member: MoDDe88
MoDDe88 Apr 02, 2008 at 13:54:09 (UTC)
Goto Top
Ja stimmt face-smile Warum kompliziert wenn es auch einfach geht ;)

Also bräuchte ich ein Programm, was den Dateinamen aus dem Ursrpungsverzeichnis nimmt, ihn in eine .ter Datei einfügt, nach dem Schema von oben und den Dateinamen so schreibt wie es in der Datei stehen soll, aber ohne dem LOW, wenn eines dabei ist (ist nur bei manchen Dateien).

Sprich:
Ursrpungsdatei:
g2xpl_4_16_34228_42992_LOW.dds

Zieldatei:
g2xpl_4_16_34228_42992.ter

Inhalt der Zieldatei:
A
800
TERRAIN

BASE_TEX_NOWRAP ../textures/g2xpl_4_16_34228_42992_LOW.dds
Member: bastla
bastla Apr 03, 2008 at 10:29:46 (UTC)
Goto Top
Hallo MoDDe88!

Sind dann diese ersten 4 Zeilen immer
A
800
TERRAIN
und somit völlig identisch?

Wenn dem so wäre und außerdem nur zu jeder Datei des Ursprungsverzeichnisses genau eine Datei im Zielverzeichnis existieren (entstehen) soll, müsste folgendes genügen:
@echo off & setlocal
set "Ordner1=D:\Ordner mit _LOWter-Dateien"  
set "Ordner2=D:\Ordner mit ter-Dateien"  
set "Praefix=BASE_TEX_NOWRAP ../textures/"  

for %%i in ("%Ordner1%\*.ter") do call :ProcessFile "%%i"  
goto :eof

:ProcessFile
set "Name=%~n1"  
(
echo A
echo 800
echo TERRAIN
echo\
echo %Praefix%%Name%.dds
)>"%Ordner2%\%Name:_LOW=%".ter"  
goto :eof
Zu überlegen wäre natürlich, was mit ev überzähligen Dateien im Zielverzeichnis (zu denen es also keine Datei im Ursprungsverzeichnis gab) passieren soll. Falls diese nicht benötigt würden, könnten im Vorhinein sämtliche ".ter"-Dateien des Zielverzeichnisses gelöscht werden ...

Grüße
bastla
Member: MoDDe88
MoDDe88 Apr 03, 2008 at 15:41:31 (UTC)
Goto Top
Glaub das passt so.
Die Situation ist folgende:
Bei dem Spiel X-Plane (Flugzeugsimulation, konkurrent zu Flight Simulator) kann man sich mit hilfe von Google die Images runterladen und so über diese detail getreue Landschaft fliegen.
Nun erstellt das Programm einen Ordner mit Texturen (.dds) und einen mit Dateien die dem Programm sagen wo er die Texturen findet.
Die .ter sagen wo er die .dds findet, deren aufbau ist immer gleich:
A
800
TERRAIN

BASE_TEX_NOWRAP ../textures/g2xpl_x_xx_xxxxx_xxxxx(_LOW).dds

Das Low ist nur manchmal dabei, wenn es sich um schlechtere Qualität handelt, aber sonst immer gleich der Aufbau, wobei g2xpl_..........dds den Namen hat der .dds textur, aber ohne dem Low, heißt nun z.b. die .dds textur g2xpl_4_16_34228_42992_low.dds muss die .ter datei g2xpl_4_16_34228_42992.ter heißen, muss aber als inhalt folgendes haben:
A
800
TERRAIN

BASE_TEX_NOWRAP ../textures/g2xpl_4_16_34228_42992_LOW.dds

Verstanden?
Ich denke das was du mir da geschrieben hat reicht vollkommen aus face-smile da man eigentlich nur die Dateien ersetzen muss, die statt einer Textur eine empty.dds textur haben, die ist nämlich schwarz und somit auch der Boden in X-Plane.

Danke dir und noch viel spaß