overdue
Goto Top

Batch für Textdatei, bestimmte Zeile suchen und ändern - Teil 2

Hallo,

ich möchte gerne das Problem aus diesem Thread, welches durch die tolle Hilfe von bastla gelöst wurde (Danke hierfür nochmal), erweitern bzw. fortsetzen.

In vorangegangenen Thread ging es darum, in einer Reihe von Textdateien, bestimmte Zeilen zu suchen und dort einen Wert zu ändern. Dabei wurden für alle Dateien dieser Werte geändert. Meine Problem jetzt ist jedoch, dass ich einzelne Dateien nacheinander verändern möchte.

Zunächst zur Vorgehensweise:

Ich erstelle mir eine Master Datei (Ausgangsdatei), diese kopiere ich und benenne die Kopien gleichzeitig entsprechend um.


Jetzt haben alle meine Input Dateien jedoch den gleichen Inhalt. Da sich die Dateien jedoch bei bestimmten Werten (Zeilen) unterscheiden müssen, muss ich diese Werte in jeder Datei ändern.

Dabei gibt es drei verschiedene Arten, neue Werte in die Dateien einzutragen:

  • zufällige Zahl (in einen bestimmten Bereich) die generiert und eingegeben wird
  • Eingabe eines Wertes durch den Benutzer
  • Werte werden aus einer anderen Liste (meistens Pfadnamen) ausgelesen und eingetragen.


Zu bemerken ist jedoch, dass nicht wie bei meinen vorherigen Thread, nach einer bestimmten Bezeichnung gesucht werden muss, sondern einfach eine bestimmte Zeile anhand der Zeilennummer komplett geändert werden kann. Ich denke dies ist dann einfacher zu programmieren, oder? Dabei kann der Wert an einer beliebigen Stelle der Zeile (in diese Fall sind sie linksbündig) stehen.

Dem Programm FAST (welches die Dateien einliest und berechnet) ist es “egal” ob die Bezeichnungen und Beschreibungen wegfallen, es braucht nur die Werte. Wichtig ist jedoch, dass sich die Zeilenanzahl und -reihenfolge nicht ändert. Ich habe eine dieser Dateien mal auf das wesentliche reduziert und die Bezeichnungen und Beschreibungen entfernt. Eine solche “bereinigte Datei” habe ich hier

Master_Input_bereinigt

online gestellt.


Ein Beispiel:

Ich habe aus der Master Input Datei eine Reihe von weiteren Input Dateien erzeugt, mit folgendem Batch:


@echo off
set Ausgangsdatei=Master_FAST_input_bereinigt.fst
set prefix=LC
set suffix=_MonopileOffshore.fst
set i=1
set j=1

type %Ausgangsdatei% > %prefix%%i%.%j%%suffix%

:A
set /A j=j+1

type %Ausgangsdatei% > %prefix%%i%.%j%%suffix%
if %j%==5 goto :B

goto :A

:B
set j=1
set /A i=i+1
IF %i%==6 (exit)
type %Ausgangsdatei% > %prefix%%i%.%j%%suffix%
goto :A



dies ergibt Folgende Dateien:

LC1.1_MonopileOffshore.fst
LC1.2_MonopileOffshore.fst
LC1.3_MonopileOffshore.fst
LC1.4_MonopileOffshore.fst
LC1.5_MonopileOffshore.fst
LC2.1_MonopileOffshore.fst
LC2.2_MonopileOffshore.fst
LC2.3_MonopileOffshore.fst
LC2.4_MonopileOffshore.fst
LC2.5_MonopileOffshore.fst
LC3.1_MonopileOffshore.fst
LC3.2_MonopileOffshore.fst
LC3.3_MonopileOffshore.fst
LC3.4_MonopileOffshore.fst
LC3.5_MonopileOffshore.fst
LC4.1_MonopileOffshore.fst
LC4.2_MonopileOffshore.fst
LC4.3_MonopileOffshore.fst
LC4.4_MonopileOffshore.fst
LC4.5_MonopileOffshore.fst
LC5.1_MonopileOffshore.fst
LC5.2_MonopileOffshore.fst
LC5.3_MonopileOffshore.fst
LC5.4_MonopileOffshore.fst
LC5.5_MonopileOffshore.fst



Jetzt möchte ich Schritt für Schritt diese Dateien, also deren Inhalt in einer bestimmten Zeile ändern. Dabei werden für jede Datei immer die selben Zeilen geändert, jedoch mit verschiedenen Werten.

Als erstes wird bei Datei „LC1.1_MonopileOffshore.fst“, der Wert in Zeile 27 (9999,9) durch eine zufällig generierte Zahl (in diesem Falle zwischen 1000 und 9999) geändert werden, in 8642.3.

Außerdem wird der Wert in Zeile 10 (560) durch eine Eingabe des Benutzers geändert (in 630)

Des weiteren befinden sich in den Input Dateien Pfadangaben zu anderen Dateien, diese Pfadangaben werden aus einer Liste gelesen und in die Datei geschrieben (wiederum in eine bestimmte Zeile, in diesem Falle Zeile132). Eine solche Liste von Pfadangaben befindet sich hier:

Liste mit Pfadnamen

Diese Pfadnamen-Liste wurde anhand bereits existierender Dateien erstellt.

Dabei soll so vorgegangen werden, dass für die erste zu bearbeitende Input Datei (hier: "LC1.1_MonopileOffshore.fst") auch der erste Pfadname aus der Liste
(in erster Zeile, hier "..\Input_Platform\LC1.1_MonopileOffshore_Platform.dat") gewählt wird, und für die zweite Datei dann der zweite Pfandname (in zweiten Zeile der Liste) usw.


Diese Schritte werden dann für jede Input-Datei durchgeführt.

Hier mal die ersten drei bearbeiteten Dateien, Augenmerk ist auf Zeile 10, 37 und 132 zu richten (mit Pfeil markiert). Das sind die Zeilen die sich geändert haben:

LC1.1_MonopileOffshore_geaendert
LC1.2_MonopileOffshore_geaendert
LC1.3_MonopileOffshore_geaendert

Anders als hier, wäre es gut wenn die vorhandenen Dateien einfach überschrieben werden und keine neue erstellt, wen doch, wäre dies jedoch nicht so tragisch.

Ich wäre euch wirklich sehr dankbar wenn ihr mir auch dabei helfen könntet! Ich weiß dass es sehr kompliziert ist, ich hoffe ich habe alles soweit verständlich erklärt.

Vielen Dank schonmal.

Grüße

Lukas

P.S.: Da das Problem aus dem vorherigen Thread u.a. mit VB Script gelöst wurde, und dies vielleicht auch hier nötig ist, bin ich mir nicht sicher ob dies hier der richtige Bereich ist. Entschuldigt bitte falls es falsch ist.
Kommentar vom Moderator Biber am Nov 26, 2011 um 19:57:20 Uhr
Ein "Gefällt mir"-Smiley für den respektvollen und sorgfältig erstellten Beitrag kommt von mir.

Content-Key: 176800

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

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

Member: bastla
bastla Nov 25, 2011 at 13:48:24 (UTC)
Goto Top
Hallo Overdue!

Nach der sehr ausführlichen Darstellung bleiben für mich trotzdem noch Fragen offen:

Wird die Liste mit den Pfadnamen eigentlich benötigt? Wie ich das verstanden habe, wäre doch zB in "LC2.5_MonopileOffshore.fst" der Pfad "..\Input_Platform\LC2.5_MonopileOffshore_Platform.dat" einzusetzen - demnach also nur "..\Input_Platform\" + Dateiname ohne Typ + "_Platform.dat"?

Umgekehrt würde es sich doch anbieten, die Benutzereingaben (für Zeile 10) tatächlich in eine Liste (zusammen mit den Dateinamen oder wenigstens Laufnummern wie "LC2.5") einzutragen - damit wäre eine bio-optische Kontrolle (Drüberschauen face-wink) möglich, und der Batch könnte ohne Unterbrechungen für die Eingabe durchlaufen. Diese Liste könnte also etwa so aussehen:
630 LC1.1
510 LC1.2
720 LC1.3
...
580 LC5.5
Zu beachten wäre, dass nach der letzten Datenzeile noch eine Zeilenschaltung folgt.

Unter der Annahme, dass beide Fragen meinen Überlegungen entsprechend zu beantworten wären, könnte der Batch so aussehen:
@echo off & setlocal
set "Ordner=D:\Ordner mit fst-Dateien"  
set "Eingaben=D:\Eingaben.txt"  
set "BasisPfad=..\Input_Platform"  
set "Anhang=_Platform.dat"  
set "T=%temp%\Temp.fst"  

pushd "%Ordner%"  
for /f "delims=" %%i in ('dir /b /a-d LC??_*.fst') do call :ProcessFile "%%i"  
popd
goto :eof

:ProcessFile
set "Name=%~n1"  
for /f "delims=_" %%i in ("%Name%") do set "Nr=%%i"  

set /a ZGanze=%random%%%9000+1000
set /a ZDez=%random%%%10

set "Ein="  
for /f %%i in ('findstr /e "%Nr%" "%Eingaben%"') do set "Ein=%%i"  
if not defined Ein echo %1 ## Eingabe nicht gefunden & goto :eof

set "Pfad=%BasisPfad%%Name%%Anhang%"  

move %1 %T%

(
    for /f "tokens=1* delims=:" %%i in ('findstr /n "^" %T%') do (  
        echo #10#27#132#|findstr "#%%i#">nul && (  
            if %%i==10 echo %Ein%.0
            if %%i==27 echo %ZGanze%.%ZDez%
            if %%i==132 echo %Pfad%
        ) || (
            echo\%%j
        )
    )
)>%1
echo %1 OK
goto :eof
Grüße
bastla
Member: Overdue
Overdue Nov 26, 2011 at 09:31:43 (UTC)
Goto Top
Hallo bastla,

Danke für die schnelle Antwort und deine Mühe. Entschuldige bitte meine verzögerte Antwort, ich musste mir noch intensiver Gedanken darüber machen, wie das mit der Eingabe ausschauen soll. Außerdem befinde ich momentan im Ausland mit +7 Stunden Zeitverschiebung.

Zuerst zu den Pfadnamen:

Diese Liste wird anhand eines Batch erstellt, dies geht auch sehr einfach und schnell.

z.B.: dieser Batch für die bereits gezeigte Liste:

for %%i in (..\Input_Platform\*.dat) do echo %%i >> liste_platform.txt
pause



Zudem werden in der Zieldatei auch andere Pfadnamen, also Verlinkungen zu anderen Dateien, eingetragen. Siehe z.B.: Zeile 135, 161, 165, 167 in bereits oben genannter Datei, welche die Input Datei, also die Zieldatei für die Änderungen darstellt
Dies ist am besten zu handhaben, wenn man diese Pfadnamen aus einer externen Liste herrausliest, da diese Pfadnamen sich auch nicht immer so aufbauen wie in diesem Beispiel.
Also deine erste Frage muss ich dadurch mit Nein beantworten. Dass die Pfadnamen sich gerade so ergeben, ist Zufall. Diese könnten theoretisch auch ganz wahllos sein


Wenn das einlesen einer externen Liste, und das damit verbundene kopieren einer bestimmten Zeile in einer andere Datei an eine bestimmten Zeile, kein Problem darstellt, könnte ich mir die Eingabe des Benutzers auch so vorstellen, in dem, so wie du vorschlägst, im CMD keine Eingabe stattfindet, sondern alles in Eingabe-Listen eingetragen wird. Dabei muss aber auch noch angegeben werden, ich welche Zeile der Zieldatei (Inputdatei) die Werte geschrieben werden sollen. Für jede zu ändernde Zeile wird dann eine neue Eingabe-Liste erstellt.

Beispiel:

Als Maß werden wieder die bereits erstellten .fst Dateien genommen (25 Stück, siehe meine Liste im ersten Eintrag)

Benuzter-Werte:

In der Reihe von Zieldateien (25 .fst-Dateien) soll sich die Zeile 10 durch die vom Benutzer erstellten Werte ändern.

Dann bereite ich mir eine solche Eingabe-Liste vor (in diesem Falle für Zeile 10)

Zeile 10

Die erste Zeile in der Eingabe-Liste gibt den Pfad an, wo sich die Zieldateien befinden und welche Dateiendung sie haben. Die zweite Zeile der Eingabe-Liste benennt die Zeile, die sich in den Zieldateien ändern soll. Die restlichen 25 Zeilen, nach der Leerzeile, sind dann die einzutragenden (bzw. zu verändernden )Werte.

So sieht dann der Bezug aus:

560 --> LC1.1_MonopileOffshore.fst (Zeile 10)
340 --> LC1.2_MonopileOffshore.fst (Zeile 10)
230 --> LC1.3_MonopileOffshore.fst (Zeile 10)
usw.

Pfadnamen:


Für das Eintragen der Pfadnamen wird dann wieder eine neue Eingabe-Liste erstellt, also für eine neue Zeile. Da ich mir mit dem oben genannten Batch diese Pfadnamen generiert habe, brauche ich nur noch den Pfad mit Zieldateien anzugeben und natürlich auch noch die Zeile die sich ändern soll zu nennen.

Die könnte so aussehen (für Zeile 132):

Zeile 132


So sieht dann der Bezug aus

..\Input_Platform\LC1.1_MonopileOffshore_Platform.dat --> LC1.1_MonopileOffshore.fst (Zeile 132)
..\Input_Platform\LC1.2_MonopileOffshore_Platform.dat --> LC1.2_MonopileOffshore.fst (Zeile 132)
..\Input_Platform\LC1.3_MonopileOffshore_Platform.dat --> LC1.3_MonopileOffshore.fst (Zeile 132)
usw.

Zufallswerte:


Für das Eintragen der zufälligen Zahlen bin ich mir nicht sicher, ob man dafür auch für jede Zieldatei, also in der Eingabeliste jeweils eine Zeile, definieren muss.

Es könnte so aussehen:

Zeile 27


Noch eine Anmerkung:

Die Angabe der Dateiendung in der Eingabeliste ist wichtig, da auch andere Dateien, welche sich ähnlich aufbauen, geändert werden müssen. Diese habe jedoch verschiedene Dateiendungen (z.B.: .dat).

Den Bereich für die Zufallszahl habe daher jetzt noch weggelassen. Denn, wie bereits erwähnt, sollen auch andere Dateien so verändert werden, dabei ändert sich auch der Bereich der Zufallszahlen. Zum Beispiel zwischen -2147483648 und 2147483647.


Ist es möglich. das ganze so umzusetzen?
Member: bastla
bastla Nov 26, 2011 at 19:29:25 (UTC)
Goto Top
Hallo Overdue!

Vorweg zu allen Listen: Um den Eintrag für die jeweils bearbeitete Datei leichter finden zu können, sollte jede der verwendeten Listen (für die Zeile 27 finde ich eine eigene Liste unnötig) den Dateinamen (übersichtlicher wird das, wenn der Dateiname am Zeilenanfang eingetragen ist) enthalten, wobei das Trennzeichen (relativ) frei gewählt werden kann (es darf nur nicht in den Daten vorkommen) - als Beispiel mit TAB:
132

LC1.1_MonopileOffshore.fst	..\Input_Platform\LC1.1_MonopileOffshore_Platform.dat
LC1.2_MonopileOffshore.fst	..\Input_Platform\LC1.2_MonopileOffshore_Platform.dat
LC1.3_MonopileOffshore.fst	..\Input_Platform\LC1.3_MonopileOffshore_Platform.dat
LC1.4_MonopileOffshore.fst	..\Input_Platform\LC1.4_MonopileOffshore_Platform.dat
LC1.5_MonopileOffshore.fst	..\Input_Platform\LC1.5_MonopileOffshore_Platform.dat
LC2.1_MonopileOffshore.fst	..\Input_Platform\LC2.1_MonopileOffshore_Platform.dat
LC2.2_MonopileOffshore.fst	..\Input_Platform\LC2.2_MonopileOffshore_Platform.dat
LC2.3_MonopileOffshore.fst	..\Input_Platform\LC2.3_MonopileOffshore_Platform.dat
LC2.4_MonopileOffshore.fst	..\Input_Platform\LC2.4_MonopileOffshore_Platform.dat
LC2.5_MonopileOffshore.fst	..\Input_Platform\LC2.5_MonopileOffshore_Platform.dat
LC3.1_MonopileOffshore.fst	..\Input_Platform\LC3.1_MonopileOffshore_Platform.dat
LC3.2_MonopileOffshore.fst	..\Input_Platform\LC3.2_MonopileOffshore_Platform.dat
LC3.3_MonopileOffshore.fst	..\Input_Platform\LC3.3_MonopileOffshore_Platform.dat
LC3.4_MonopileOffshore.fst	..\Input_Platform\LC3.4_MonopileOffshore_Platform.dat
LC3.5_MonopileOffshore.fst	..\Input_Platform\LC3.5_MonopileOffshore_Platform.dat
LC4.1_MonopileOffshore.fst	..\Input_Platform\LC4.1_MonopileOffshore_Platform.dat
LC4.2_MonopileOffshore.fst	..\Input_Platform\LC4.2_MonopileOffshore_Platform.dat
LC4.3_MonopileOffshore.fst	..\Input_Platform\LC4.3_MonopileOffshore_Platform.dat
LC4.4_MonopileOffshore.fst	..\Input_Platform\LC4.4_MonopileOffshore_Platform.dat
LC4.5_MonopileOffshore.fst	..\Input_Platform\LC4.5_MonopileOffshore_Platform.dat
LC5.1_MonopileOffshore.fst	..\Input_Platform\LC5.1_MonopileOffshore_Platform.dat
LC5.2_MonopileOffshore.fst	..\Input_Platform\LC5.2_MonopileOffshore_Platform.dat
LC5.3_MonopileOffshore.fst	..\Input_Platform\LC5.3_MonopileOffshore_Platform.dat
LC5.4_MonopileOffshore.fst	..\Input_Platform\LC5.4_MonopileOffshore_Platform.dat
LC5.5_MonopileOffshore.fst	..\Input_Platform\LC5.5_MonopileOffshore_Platform.dat
Die Zeilennummer kann in die Liste aufgenommen werden, allerdings muss jede Liste individuell im Batch angesprochen werden (wenn Du nicht alle Werte in eine einzige Liste packen kannst / willst) ...

Für die Angabe der zu verarbeitenden Dateien wäre die Aufteilung in Pfad ("..\Input_FAST") und Dateimaske ("*.fst") vorteilhafter und mE auch nur einmalig (am Beginn des Batches) per direktem Eintrag festzulegen (und somit nicht in die Dateilisten aufzunehmen).

Der Batch (schneller wurde er durch die neuen Anforderungen definitiv nicht face-wink) würde dann so aussehen:
@echo off & setlocal 
set "Ordner=set "Ordner=..\Input_FAST"  
set "Dateien=*.fst"  

set "Eingaben=D:\Eingaben.txt"   
set "Pfade=D:\Pfadliste.txt"  

set /p EinZeile=<"%Eingaben%"  
set /p PfadZeile=<"%Pfade%"  
set ZufallZeile=27

set "T=%temp%\Temp-fst"  

pushd "%Ordner%"  
for /f "delims=" %%i in ('dir /b /a-d "%Dateien%"') do call :ProcessFile "%%i"  
popd
goto :eof

:ProcessFile
set "Ein="  
for /f "tokens=1* delims=	" %%i in ('findstr /i /b /c:"%~nx1" "%Eingaben%"') do set "Ein=%%j"  
if not defined Ein echo %1 ## Eingabe nicht gefunden & goto :eof

set "Pfad="  
for /f "tokens=1* delims=	" %%i in ('findstr /i /b /c:"%~nx1" "%Pfade%"') do set "Pfad=%%j"  
if not defined Pfad echo %1 ## Pfad nicht gefunden & goto :eof

set /a ZGanze=%random%%%9000+1000
set /a ZDez=%random%%%10

move %1 %T%

(
    for /f "tokens=1* delims=:" %%i in ('findstr /n "^" %T%') do (  
        echo #%EinZeile%#%ZufallZeile%#%PfadZeile%#|findstr "#%%i#">nul && (  
            if %%i==%EinZeile% echo %Ein%.0
            if %%i==%ZufallZeile% echo %ZGanze%.%ZDez%
            if %%i==%PfadZeile% echo %Pfad%
        ) || (
            echo\%%j
        )
    )
)>%1
echo %1 OK
goto :eof
Bitte beachten: In den Zeilen 21 und 25 ist als Delimiter jeweils ein TAB einzutragen!
Mit dem Bereich -2147483648 bis 2147483647 kommst Du zwar genau an die Arithmetik-Grenzen von Batch - da mit diesen Zahlen aber (soweit ich bisher weiß) ohnehin nicht gerechnet werden muss, wären auch größere Werte (als Kombination mehrerer Strings) machbar.

Grüße
bastla
Member: Overdue
Overdue Nov 28, 2011 at 08:58:29 (UTC)
Goto Top
Hallo bastla,

wieder einmal großen Dank an dich! Das ist wirklich perfekte, schnelle und zuverlässige Arbeit die du hier leistest. Das klappt wirklich ganz toll.
Ich weiß nur noch nicht ob ich das ganze als „gelöst“ markieren muss, da ich noch ein paar zusätzliche Fragen habe.

Ich habe dein Batch zunächst einmal in drei Teile aufgesplittet. Einmal für die Eingabe der Benutzerdaten, dann die Pfadnamen und die Zufallszahlen.

Eingabe Benutzerdaten:

@echo off & setlocal 
set "Ordner=E:\test"  
set "Dateien=*.fst"  

set "Eingaben=E:\test\Zeile25.txt"  
set /p EinZeile=<"%Eingaben%"  
set "T=%temp%\Temp-fst"  
pushd "%Ordner%"  
for /f "delims=" %%i in ('dir /b /a-d "%Dateien%"') do call :ProcessFile "%%i"  
popd
goto :eof
:ProcessFile
set "Ein="  
for /f "tokens=1* delims=	" %%i in ('findstr /i /b /c:"%~nx1" "%Eingaben%"') do set "Ein=%%j"  
if not defined Ein echo %1 ## Eingabe nicht gefunden & goto :eof
move %1 %T%

(
    for /f "tokens=1* delims=:" %%i in ('findstr /n "^" %T%') do (  
        echo #%EinZeile%#|findstr "#%%i#">nul && (  
            if %%i==%EinZeile% echo %Ein%
            
        ) || (
            echo\%%j
        )
    )
)>%1
echo %1 OK
goto :eof

pause


Dies ist auf jeden Fall perfekt, und werde es so übernehmen.

Bei der Erstellung der Liste der Zieldateien, setze ich hinter deren Dateinamen Kommata. So kann ich die Datei leicht in Excel (im .csv-Format) bearbeiten. Die zweite Spalte fülle ich mit meinen Zahlen und speichere dann wieder als .txt-Format. So enstehen dann die geforderten Tabstopps und die Datei kann verwendet werden.


Pfadnamen:

@echo off & setlocal 
set "Ordner=E:\test"  
set "Dateien=*.fst"  
set "Eingaben=E:\test\Zeile10.txt"  
set "Pfade=E:\test\Zeile132.txt"  

set /p PfadZeile=<"%Pfade%"  
set "T=%temp%\Temp-fst"  

pushd "%Ordner%"  
for /f "delims=" %%i in ('dir /b /a-d "%Dateien%"') do call :ProcessFile "%%i"  
popd
goto :eof
:ProcessFile
set "Pfad="  
for /f "tokens=1* delims=	" %%i in ('findstr /i /b /c:"%~nx1" "%Pfade%"') do set "Pfad=%%j"  
if not defined Pfad echo %1 ## Pfad nicht gefunden & goto :eof
move %1 %T%

(
    for /f "tokens=1* delims=:" %%i in ('findstr /n "^" %T%') do (  
        echo #%PfadZeile%#|findstr "#%%i#">nul && (  
            
            if %%i==%PfadZeile% echo %Pfad%
        ) || (
            echo\%%j
        )
    )
)>%1
echo %1 OK
goto :eof

Hierzu habe ich eine Frage:

Um eine Eingabe-Liste zu erstellen, wie bastla sie im vorherigen Beitrag dargestellt hat, müsste ich, zum einem die Liste der Dateinamen der Zieldateien und zum anderen die Liste der Pfadnamen in eine Liste zusammenfügen. Das bekomme ich fast hin. Ähnlich wie bei der Liste Benutzerdaten versehe ich die Listen mit Kommata (der Pfadnamen und Zieldateien) um verschiedene Spalten zu erstellen. Wenn ich die beiden Listen jedoch kombinieren möchte, werden die Daten versetzt untereinander geschrieben und nicht in eine Zeile.

Also diese Liste Zieldateien und diese Liste Pfadnamen habe ich mit diesem Batch

type liste_Zieldaten.txt >> zusammengefuegt.csv
type liste_platform.txt >> zusammengefuegt.csv

zusammengefügt.

Dabei erhalte ich aber (wenn ich es als Textdatei umwandle) dies ich möchte aber das.


Zufallszahlen:

Einen Batch alleine für die Zufallszahlen habe ich folgendermaßen ausgegliedert:

@echo off & setlocal 
set "Ordner=E:\test"  
set "Dateien=*.fst"  

set ZufallZeile=27
set "T=%temp%\Temp-fst"  

pushd "%Ordner%"  
for /f "delims=" %%i in ('dir /b /a-d "%Dateien%"') do call :ProcessFile "%%i"  
popd
goto :eof
:ProcessFile


set /a ZGanze=%random%%%9000+1000
set /a ZDez=%random%%%10

move %1 %T%

(
    for /f "tokens=1* delims=:" %%i in ('findstr /n "^" %T%') do (  
        echo #%ZufallZeile%#|findstr "#%%i#">nul && (  
        
            if %%i==%ZufallZeile% echo %ZGanze%.%ZDez%
           
        ) || (
            echo\%%j
        )
    )
)>%1
echo %1 OK
goto :eof

Hier meine Frage, ob man hier auch eine Liste von den Zieldateien einbinden kann? Im vorliegenden Fall werden alle Dateien mit .fst-Endung bearbeitet.


Falls dies alles nicht Möglich ist, bzw. den Rahmen sprengt, kann ich das verstehen. Ich bin für die bisherige Hilfe schon mehr als dankbar!

Grüße

Lukas
Member: bastla
bastla Nov 28, 2011, updated at Oct 18, 2012 at 16:49:13 (UTC)
Goto Top
Hallo Overdue!

Schön, wenn's schon mal hilft ... face-smile
Zum Thema "TAB als Trennzeichen": Muss nicht face-wink - wenn Du guten Gewissens ein Komma verwenden kannst, muss das ja nur (wie oben angesprochen) jeweils als Delimiter angegeben werden (auf TAB war ich gekommen, weil so die Daten etwas übersichtlicher sind) ...
Hinsichtlich des Zusammenfügens könntest Du es (frei nach rubberman) so versuchen:
@echo off & setlocal enabledelayedexpansion

set "InFile1=liste_Zieldaten.txt"  
set "InFile2=liste_platform.txt"  
set "OutFile=Zeile132.txt"  

>"%OutFile%" echo 132  
<"%InFile2%" >"%OutFile%" ( for /f "tokens=1* delims=:" %%a in ('findstr /n "^" "%InFile1%"') do (  
    set /p "Line="  
    echo\%%b	!Line!
  )
)
In Zeile 10 wird als Trennzeichen noch TAB verwendet - kannst Du aber gerne austauschen ...

Grüße
bastla
Member: bastla
bastla Nov 28, 2011 at 18:09:57 (UTC)
Goto Top
... Nachtrag zur Frage
ob man hier auch eine Liste von den Zieldateien einbinden kann?
Im einfachsten Fall (wenn die Vorgabe einer exakteren Dateimaske der Art
set "Dateien=LC??_*.fst"
nicht genügt) könntest Du
for /f "delims=" %%i in ('dir /b /a-d "%Dateien%"') do
durch
for /f "usebackq delims=" %%i in ("%QuellDateiListe%") do
ersetzen ...

Sollten sich die Dateien zB in verschiedenen Ordnern befinden, wäre vermutlich für jeden Schleifendurchlauf ein zusätzliches
pushd "%%~dpi"
(und natürlich das zugehörige "popd") erforderlich.

Grüße
bastla
Member: Overdue
Overdue Nov 29, 2011 at 12:12:12 (UTC)
Goto Top
Alles klar, Danke auch dafür. Habe den Beitrag damit als gelöst markiert, was er durch die tolle Hilfe von bastla auch ist!

vielen Dank für alles.