Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
Kommentar vom Moderator Biber am 26.11.2011 um 20:57:20 Uhr
Ein "Gefällt mir"-Smiley für den respektvollen und sorgfältig erstellten Beitrag kommt von mir.
GELÖST

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

Frage Entwicklung Batch & Shell

Mitglied: Overdue

Overdue (Level 1) - Jetzt verbinden

25.11.2011, aktualisiert 18.10.2012, 4031 Aufrufe, 7 Kommentare, 2 Danke

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:


01.
@echo off 
02.
set Ausgangsdatei=Master_FAST_input_bereinigt.fst 
03.
set prefix=LC 
04.
set suffix=_MonopileOffshore.fst 
05.
set i=1 
06.
set j=1 
07.
 
08.
type %Ausgangsdatei% > %prefix%%i%.%j%%suffix% 
09.
 
10.
:A 
11.
set /A j=j+1 
12.
 
13.
type %Ausgangsdatei% > %prefix%%i%.%j%%suffix% 
14.
if %j%==5 goto :B 
15.
 
16.
goto :A 
17.
 
18.
:B 
19.
set j=1 
20.
set /A i=i+1 
21.
IF %i%==6 (exit) 
22.
type %Ausgangsdatei% > %prefix%%i%.%j%%suffix% 
23.
goto :A 
24.
 



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.
Mitglied: bastla
25.11.2011 um 14:48 Uhr
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 ) möglich, und der Batch könnte ohne Unterbrechungen für die Eingabe durchlaufen. Diese Liste könnte also etwa so aussehen:
01.
630 LC1.1 
02.
510 LC1.2 
03.
720 LC1.3 
04.
... 
05.
580 LC5.5 
06.
 
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:
01.
@echo off & setlocal 
02.
set "Ordner=D:\Ordner mit fst-Dateien" 
03.
set "Eingaben=D:\Eingaben.txt" 
04.
set "BasisPfad=..\Input_Platform" 
05.
set "Anhang=_Platform.dat" 
06.
set "T=%temp%\Temp.fst" 
07.
 
08.
pushd "%Ordner%" 
09.
for /f "delims=" %%i in ('dir /b /a-d LC??_*.fst') do call :ProcessFile "%%i" 
10.
popd 
11.
goto :eof 
12.
 
13.
:ProcessFile 
14.
set "Name=%~n1" 
15.
for /f "delims=_" %%i in ("%Name%") do set "Nr=%%i" 
16.
 
17.
set /a ZGanze=%random%%%9000+1000 
18.
set /a ZDez=%random%%%10 
19.
 
20.
set "Ein=" 
21.
for /f %%i in ('findstr /e "%Nr%" "%Eingaben%"') do set "Ein=%%i" 
22.
if not defined Ein echo %1 ## Eingabe nicht gefunden & goto :eof 
23.
 
24.
set "Pfad=%BasisPfad%%Name%%Anhang%" 
25.
 
26.
move %1 %T% 
27.
 
28.
29.
    for /f "tokens=1* delims=:" %%i in ('findstr /n "^" %T%') do ( 
30.
        echo #10#27#132#|findstr "#%%i#">nul && ( 
31.
            if %%i==10 echo %Ein%.0 
32.
            if %%i==27 echo %ZGanze%.%ZDez% 
33.
            if %%i==132 echo %Pfad% 
34.
        ) || ( 
35.
            echo\%%j 
36.
37.
38.
)>%1 
39.
echo %1 OK 
40.
goto :eof
Grüße
bastla
Bitte warten ..
Mitglied: Overdue
26.11.2011 um 10:31 Uhr
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:

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


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?
Bitte warten ..
Mitglied: bastla
26.11.2011 um 20:29 Uhr
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:
01.
132 
02.
 
03.
LC1.1_MonopileOffshore.fst	..\Input_Platform\LC1.1_MonopileOffshore_Platform.dat 
04.
LC1.2_MonopileOffshore.fst	..\Input_Platform\LC1.2_MonopileOffshore_Platform.dat 
05.
LC1.3_MonopileOffshore.fst	..\Input_Platform\LC1.3_MonopileOffshore_Platform.dat 
06.
LC1.4_MonopileOffshore.fst	..\Input_Platform\LC1.4_MonopileOffshore_Platform.dat 
07.
LC1.5_MonopileOffshore.fst	..\Input_Platform\LC1.5_MonopileOffshore_Platform.dat 
08.
LC2.1_MonopileOffshore.fst	..\Input_Platform\LC2.1_MonopileOffshore_Platform.dat 
09.
LC2.2_MonopileOffshore.fst	..\Input_Platform\LC2.2_MonopileOffshore_Platform.dat 
10.
LC2.3_MonopileOffshore.fst	..\Input_Platform\LC2.3_MonopileOffshore_Platform.dat 
11.
LC2.4_MonopileOffshore.fst	..\Input_Platform\LC2.4_MonopileOffshore_Platform.dat 
12.
LC2.5_MonopileOffshore.fst	..\Input_Platform\LC2.5_MonopileOffshore_Platform.dat 
13.
LC3.1_MonopileOffshore.fst	..\Input_Platform\LC3.1_MonopileOffshore_Platform.dat 
14.
LC3.2_MonopileOffshore.fst	..\Input_Platform\LC3.2_MonopileOffshore_Platform.dat 
15.
LC3.3_MonopileOffshore.fst	..\Input_Platform\LC3.3_MonopileOffshore_Platform.dat 
16.
LC3.4_MonopileOffshore.fst	..\Input_Platform\LC3.4_MonopileOffshore_Platform.dat 
17.
LC3.5_MonopileOffshore.fst	..\Input_Platform\LC3.5_MonopileOffshore_Platform.dat 
18.
LC4.1_MonopileOffshore.fst	..\Input_Platform\LC4.1_MonopileOffshore_Platform.dat 
19.
LC4.2_MonopileOffshore.fst	..\Input_Platform\LC4.2_MonopileOffshore_Platform.dat 
20.
LC4.3_MonopileOffshore.fst	..\Input_Platform\LC4.3_MonopileOffshore_Platform.dat 
21.
LC4.4_MonopileOffshore.fst	..\Input_Platform\LC4.4_MonopileOffshore_Platform.dat 
22.
LC4.5_MonopileOffshore.fst	..\Input_Platform\LC4.5_MonopileOffshore_Platform.dat 
23.
LC5.1_MonopileOffshore.fst	..\Input_Platform\LC5.1_MonopileOffshore_Platform.dat 
24.
LC5.2_MonopileOffshore.fst	..\Input_Platform\LC5.2_MonopileOffshore_Platform.dat 
25.
LC5.3_MonopileOffshore.fst	..\Input_Platform\LC5.3_MonopileOffshore_Platform.dat 
26.
LC5.4_MonopileOffshore.fst	..\Input_Platform\LC5.4_MonopileOffshore_Platform.dat 
27.
LC5.5_MonopileOffshore.fst	..\Input_Platform\LC5.5_MonopileOffshore_Platform.dat 
28.
 
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 ) würde dann so aussehen:
01.
@echo off & setlocal  
02.
set "Ordner=set "Ordner=..\Input_FAST" 
03.
set "Dateien=*.fst" 
04.
 
05.
set "Eingaben=D:\Eingaben.txt"  
06.
set "Pfade=D:\Pfadliste.txt" 
07.
 
08.
set /p EinZeile=<"%Eingaben%" 
09.
set /p PfadZeile=<"%Pfade%" 
10.
set ZufallZeile=27 
11.
 
12.
set "T=%temp%\Temp-fst" 
13.
 
14.
pushd "%Ordner%" 
15.
for /f "delims=" %%i in ('dir /b /a-d "%Dateien%"') do call :ProcessFile "%%i" 
16.
popd 
17.
goto :eof 
18.
 
19.
:ProcessFile 
20.
set "Ein=" 
21.
for /f "tokens=1* delims=	" %%i in ('findstr /i /b /c:"%~nx1" "%Eingaben%"') do set "Ein=%%j" 
22.
if not defined Ein echo %1 ## Eingabe nicht gefunden & goto :eof 
23.
 
24.
set "Pfad=" 
25.
for /f "tokens=1* delims=	" %%i in ('findstr /i /b /c:"%~nx1" "%Pfade%"') do set "Pfad=%%j" 
26.
if not defined Pfad echo %1 ## Pfad nicht gefunden & goto :eof 
27.
 
28.
set /a ZGanze=%random%%%9000+1000 
29.
set /a ZDez=%random%%%10 
30.
 
31.
move %1 %T% 
32.
 
33.
34.
    for /f "tokens=1* delims=:" %%i in ('findstr /n "^" %T%') do ( 
35.
        echo #%EinZeile%#%ZufallZeile%#%PfadZeile%#|findstr "#%%i#">nul && ( 
36.
            if %%i==%EinZeile% echo %Ein%.0 
37.
            if %%i==%ZufallZeile% echo %ZGanze%.%ZDez% 
38.
            if %%i==%PfadZeile% echo %Pfad% 
39.
        ) || ( 
40.
            echo\%%j 
41.
42.
43.
)>%1 
44.
echo %1 OK 
45.
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
Bitte warten ..
Mitglied: Overdue
28.11.2011 um 09:58 Uhr
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:

01.
 
02.
@echo off & setlocal  
03.
set "Ordner=E:\test" 
04.
set "Dateien=*.fst" 
05.
 
06.
set "Eingaben=E:\test\Zeile25.txt" 
07.
set /p EinZeile=<"%Eingaben%" 
08.
set "T=%temp%\Temp-fst" 
09.
pushd "%Ordner%" 
10.
for /f "delims=" %%i in ('dir /b /a-d "%Dateien%"') do call :ProcessFile "%%i" 
11.
popd 
12.
goto :eof 
13.
:ProcessFile 
14.
set "Ein=" 
15.
for /f "tokens=1* delims=	" %%i in ('findstr /i /b /c:"%~nx1" "%Eingaben%"') do set "Ein=%%j" 
16.
if not defined Ein echo %1 ## Eingabe nicht gefunden & goto :eof 
17.
move %1 %T% 
18.
 
19.
20.
    for /f "tokens=1* delims=:" %%i in ('findstr /n "^" %T%') do ( 
21.
        echo #%EinZeile%#|findstr "#%%i#">nul && ( 
22.
            if %%i==%EinZeile% echo %Ein% 
23.
             
24.
        ) || ( 
25.
            echo\%%j 
26.
27.
28.
)>%1 
29.
echo %1 OK 
30.
goto :eof 
31.
 
32.
pause 
33.
 

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:

01.
 
02.
 
03.
@echo off & setlocal  
04.
set "Ordner=E:\test" 
05.
set "Dateien=*.fst" 
06.
set "Eingaben=E:\test\Zeile10.txt" 
07.
set "Pfade=E:\test\Zeile132.txt" 
08.
 
09.
set /p PfadZeile=<"%Pfade%" 
10.
set "T=%temp%\Temp-fst" 
11.
 
12.
pushd "%Ordner%" 
13.
for /f "delims=" %%i in ('dir /b /a-d "%Dateien%"') do call :ProcessFile "%%i" 
14.
popd 
15.
goto :eof 
16.
:ProcessFile 
17.
set "Pfad=" 
18.
for /f "tokens=1* delims=	" %%i in ('findstr /i /b /c:"%~nx1" "%Pfade%"') do set "Pfad=%%j" 
19.
if not defined Pfad echo %1 ## Pfad nicht gefunden & goto :eof 
20.
move %1 %T% 
21.
 
22.
23.
    for /f "tokens=1* delims=:" %%i in ('findstr /n "^" %T%') do ( 
24.
        echo #%PfadZeile%#|findstr "#%%i#">nul && ( 
25.
             
26.
            if %%i==%PfadZeile% echo %Pfad% 
27.
        ) || ( 
28.
            echo\%%j 
29.
30.
31.
)>%1 
32.
echo %1 OK 
33.
goto :eof 
34.
 
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

01.
 
02.
type liste_Zieldaten.txt >> zusammengefuegt.csv 
03.
type liste_platform.txt >> zusammengefuegt.csv 
04.
 
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:

01.
 
02.
@echo off & setlocal  
03.
set "Ordner=E:\test" 
04.
set "Dateien=*.fst" 
05.
 
06.
set ZufallZeile=27 
07.
set "T=%temp%\Temp-fst" 
08.
 
09.
pushd "%Ordner%" 
10.
for /f "delims=" %%i in ('dir /b /a-d "%Dateien%"') do call :ProcessFile "%%i" 
11.
popd 
12.
goto :eof 
13.
:ProcessFile 
14.
 
15.
 
16.
set /a ZGanze=%random%%%9000+1000 
17.
set /a ZDez=%random%%%10 
18.
 
19.
move %1 %T% 
20.
 
21.
22.
    for /f "tokens=1* delims=:" %%i in ('findstr /n "^" %T%') do ( 
23.
        echo #%ZufallZeile%#|findstr "#%%i#">nul && ( 
24.
         
25.
            if %%i==%ZufallZeile% echo %ZGanze%.%ZDez% 
26.
            
27.
        ) || ( 
28.
            echo\%%j 
29.
30.
31.
)>%1 
32.
echo %1 OK 
33.
goto :eof 
34.
 
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
Bitte warten ..
Mitglied: bastla
28.11.2011, aktualisiert 18.10.2012
Hallo Overdue!

Schön, wenn's schon mal hilft ...
Zum Thema "TAB als Trennzeichen": Muss nicht - 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 Friemler bzw rubberman) so versuchen:
01.
@echo off & setlocal enabledelayedexpansion 
02.
 
03.
set "InFile1=liste_Zieldaten.txt" 
04.
set "InFile2=liste_platform.txt" 
05.
set "OutFile=Zeile132.txt" 
06.
 
07.
>"%OutFile%" echo 132 
08.
<"%InFile2%" >"%OutFile%" ( for /f "tokens=1* delims=:" %%a in ('findstr /n "^" "%InFile1%"') do ( 
09.
    set /p "Line=" 
10.
    echo\%%b	!Line! 
11.
12.
)
In Zeile 10 wird als Trennzeichen noch TAB verwendet - kannst Du aber gerne austauschen ...

Grüße
bastla
Bitte warten ..
Mitglied: bastla
28.11.2011 um 19:09 Uhr
... 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
Bitte warten ..
Mitglied: Overdue
29.11.2011 um 13:12 Uhr
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.
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
VB for Applications
gelöst Vbscript bestimmte Zeile ungeachtet der Nummerierung löschen (4)

Frage von aletri zum Thema VB for Applications ...

Batch & Shell
gelöst Per Batch Konfliktdateien in Dropbox suchen (4)

Frage von nobbi49 zum Thema Batch & Shell ...

Batch & Shell
Per Batch Textdatei Spaltenweise auslesen nochmal weil ich dumm bin (9)

Frage von PinkFLuffyUnicorn zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (17)

Frage von liquidbase zum Thema Windows Update ...