Batch Textfile auslesen und mit bestimmten Schema wieder schreiben

ibbazabbi

Cadet 4th Year
Registriert
Dez. 2007
Beiträge
92
Hallo liebe Computerbase´ler,

ich benötige mal eure Hilfe, ich glaube ich bin einfach zu jung dafür ;)

Grob: Ich möchte aus einer einfachen Textdatei die Zeile auslesen und in eine neue Textdatei nach einem bestimmten Schema schreiben mittels batch.

Im Detail:
Ich habe ein Textfile mit dem Pfad und dem Dateinamen von bestimmten Dateien, welche ich mir schon mittels Batch erstellen lassen habe. (Länge variabel)

Format wäre:

„C:\Temp\Ordner\File1.dgn
C:\Temp\Ordner\File2.dgn
und so weiter…

Daraus soll eine Textdatei mit nachfolgendem Format entstehen:

„gen macro File1.macro
isff /File1.dgn /Datum_File1.dgn

gen macro File2.macro
isff /File2.dgn /Datum_File2.dgn

und eine 2. Textdatei soll leicht abgewandelt entstehen:

„gen macro File1_test.macro
command ‘xyz / Datum_File1_test.dgn’
isff /File1.dgn /Datum_File1_test.dgn

gen macro File2_test.macro
command ‘xyz / Datum_File2_test.dgn’
isff /File2.dgn /DatumFile2test.dgn

Erklärung:
  • File-Bezeichnung soll übernommen werden
  • an manchen Stellen auch die Dateiendung (variabel)
  • das aktuelle Datum soll an den gewissen Stellen hinzugefügt werden.
  • in der 2. Datei soll zusätzlich noch ein Präfix(_test) und eine weitere Zeile hinzukommen
das ganze soll mit variablen Pfaden passieren, damit ich die Batch in den verschiedenen Ordnern nutzen kann. Sollten oder können gern 2 batch werden um die 2 Dateien zu erstellen.

Wäre schön wenn mir jemand den Syntax geben könnte oder zumindest mir die groben Befehle geben, um mich dann dort tiefer einarbeiten zu können.

Ich danke euch schonmal für eure Hilfe!


Greetz ibbazabbi
 
Ernst gemeinter Ratschlag: Lass es sein.

Warum? Batch is a bitch. Für solche Zwecke ist Batch einfach denkbar ungeeignet, weil es in weiten Teilen vollkommen absurd designed ist. Besser wäre hier ein PowerShell oder vba-Skript, weil man da deutlich mehr Möglichkeiten hat - zB Dinge wie Suchen und Ersetzen via Regulärem Ausdruck (regex).

Wenn's unbedingt Batch werden soll, würde ich das ansonsten etwas kapseln. Anbei ein Beispiel wie sowas aussehen könnte, nur eine der beiden Varianten und kein Anspruch auf Fehlerfreiheit:

Code:
SET outfile=c:\out.txt
SET infile=c:\temp\file1.dgn

CALL:WRITETOOUT %infile%
GOTO:EOF

:WRITETOOUT
SET filename=%~n1
SET datestring=%date:~6,4%%date:~3,2%%date:~0,2%
echo gen macro %filename%.macro>>outfile
echo isff /%filename%.dgn /%datestring%_%filename%.dgn:>>outfile
GOTO:EOF

Jetzt müsstest du nur noch die zweite Variante dazubasteln und deine Liste von Quelldateien in einer FOR-Schleife ablaufen und die Funktionen callen.
 
  • Gefällt mir
Reaktionen: ibbazabbi
Danke dir, hab jetzt genau das was ich brauche!

Ja, batch ist nicht das Beste, aber ich brauch am Ende nur eine einfache Datei die ich mit meinem CAD Programm aufrufen kann. Da reicht mir das vollkommen aus.
 
@Raijin
kannst du mir vielleicht noch kurz helfen? Habe die Datei jetzt mit allem drum und dran komplettiert (vor- und nachgestellter Text)und macht was sie soll. Jedoch ist mir gerade beim Nutzen aufgefallen, das mein nachgeschaltetes Programm den Befehl "ISFF" nur 23 mal ausführt und den Rest in der Datei dann ignoriert
Ich müsste daher entweder bei einer gewissen Anzahl an eingelesenen Zeilen (z.B. 23) oder ausgegeben "ISFF" die Datei splitten und in eine neue Datei am besten mit Suffix "_01" "_02" etc schreiben.

Ich könnte ja verschiedene "WRITETOOUT" definieren und bei der Anzahl dahin springen, aber das geht ja bestimmt eleganter...

hier mal mein aktueller Code:


Code:
SET outfile=%~dp0\ImportDGN_stru.mac
rem SET outfile=c:\temp\out2.txt
SET infile=%~dp0\~content_for_mac.txt
rem SET infile=c:\temp\~content_dgn.txt
SET macfolder=/MACs
SET suffix=_stru

if not exist "%~dp0%macfolder%/" md "%~dp0%macfolder%/"

echo. >%outfile%
rem echo. units /a_L51_1.dgn>>%outfile%
echo. >>%outfile%
echo UNITS METER>>%outfile%
echo stru>>%outfile%
echo GROUPP ON>>%outfile%
echo reportsteel off>>%outfile%
echo groupprimitives 500>>%outfile%
echo. >>%outfile%
echo  $M/profiles_din.imp>>%outfile%
echo. >>%outfile%


FOR /F %%i in (%infile%) do (
set "filefolder=%%i"

CALL:WRITETOOUT %%i
)
GOTO:EOF
:WRITETOOUT
SET filename=%~n1
SET fileext=%~x1
SET datestring=%date:~6,4%%date:~3,2%%date:~0,2%
echo gen macro %macfolder%/%filename%%suffix%.macro>>%outfile%
echo PDMSCOMMAND 'NEW ZONE /%datestring%_%filename%%suffix%%fileext%'>>%outfile%
echo isff /%filefolder% /%datestring%_%filename%%suffix%%fileext%>>%outfile%
echo. >>%outfile%


GOTO:EOF

Danke für deine Hilfe!
 
Wie ich schon sagte: Batch is a bitch!

Zu viel möchte ich mich daher auch nicht wirklich damit beschäftigen, sorry. Eine simple Lösung wäre, wenn du in der FOR-Schleife einen index mitzählst und dann mittels IF ab 23 eben in einen zweiten Case fällst.

Du kannst die Funktion WRITETOOUT auch um einen zweiten Parameter erweitern, den Pfad für den Output.

Code:
for ... (
   IF %index% LEQ 23 (
      CALL:WRITETOOUT %%i myoutfile.txt
   ) ELSE (
      CALL:WRITETOOUT %%i myoutfile_2.txt
   )
)
CALL:WRITETOOUT myinfile.bla myoutfile.blubb
GOTO:EOF

:WRITETOOUT
SET filename=%~n1
SET output=%2
echo .... >>%output
GOTO:EOF

Allerdings klappt das nicht mehr, wenn das zweite 23er File voll ist. Dann müsstest du den Index mit Modulo berechnen, der immer nur 0-22 zählt, und anschließend einen File-Counter einbauen, der wiederum die _1, _2, _3 an den Dateinamen anhängt.
 
  • Gefällt mir
Reaktionen: ibbazabbi
Wieso denn unbedingt Batch? Zumindest Powershell wäre doch wahrscheinlich möglich, da man nichts installieren muss.
Sonst Python!
 
Meine Rede..
 
danke Raijin, habe jetzt auch festgestellt das ich hier nicht wirklich weiter komme mit Batch... naja Plan B, lösch ich jedes mal beim Abfeuern aus meine Macrodatei einfach die ersten 23 Befehle raus, geht auch^^

warum kein Powershell? Naja ganz klar, damit kenne ich mich garnicht aus, bei Batch habe ich wenigstens ein rudimentäres Wissen und man findet dazu auch mehr im Netz...
Und ja, installieren ist hier nicht möglich...

Also falls jemand fit ist in Powershell, kann mir gern den Code dazu schreiben ;-)
 
Zurück
Oben