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
GELÖST

Gleiche Zeilen in einer Textdatei zusammenfassen

Frage Entwicklung Batch & Shell

Mitglied: vvss

vvss (Level 1) - Jetzt verbinden

06.09.2011 um 17:51 Uhr, 3365 Aufrufe, 17 Kommentare

Hallo Zusammen,


Weiß leider nicht wie ich das ohne Hilfe machen soll?

Und zwar habe ich eine Texdatei die wie folgt aufgebaut ist:


AA_Beispieltext von AA1-1
BB_Beispieltext von BB1-1
CC_Beispieltext von CC1-1
DD_Beispieltext von DD1-1
DD_Beispieltext von DD1-2
DD_Beispieltext von DD1-3
EE_Beispieltext von EE1-1
FF_Beispieltext von FF1-1
AA_Beispieltext von AA2-1
BB_Beispieltext von BB2-1
CC_Beispieltext von CC2-1
DD_Beispieltext von DD2-1
DD_Beispieltext von DD2-2
EE_Beispieltext von EE2-1
FF_Beispieltext von FF2-1

Mein Problem liegt nun darin, zwischen den Zeilen AA1-1 und AA2-1 sollen die DD-Zeilen in einer einzigen DD-Zeile hintereinander geschrieben werden.
Die neue Zeile (DD_Beispieltext von DD1-1Beispieltext von DD1-2Beispieltext von DD1-3) soll nun auch noch unter die Zeile AA1-1 geschoben werden,und auch noch gefolgt von Zeile EE-1-1.



Die neue Textdatei sollte wie dann wie folgt aussehen:

AA
DD (1 bis xxx in einer Zeile)
EE
CC
FF
AA
DD
usw.


Danke für Eure Hilfe !!!!!
Mitglied: rubberman
06.09.2011 um 19:07 Uhr
Hallo -vvss-.

Das Ganze ist ziemlich abstrakt für mein Verständnis. Wie würde so etwas denn real aussehen?
Hast du es mit einer Art HTML oder XML Text zu tun?
Gibt es Zeileneinzüge (kann man bei dir nicht sehen, weil du deinen Beispielinhalt nicht in Code-Tags eingeschlossen hast)?
Gibt es feste Breiten?
Ist immer die selbe Anzahl an Leerzeichen in einer Zeile?
Gibt es Zeichen, an denen die Zeile aufgesplittet werden könnte?
...

Grüße
rubberman
Bitte warten ..
Mitglied: Friemler
06.09.2011 um 19:14 Uhr
Hallo -vvss-,

teste mal folgendes:
01.
@echo off & setlocal 
02.
 
03.
 
04.
::Diese beiden Variablen anpassen 
05.
set "InFile=.\test.txt" 
06.
set "OutFile=.\test2.txt" 
07.
 
08.
 
09.
::Interne Variablen initialisieren 
10.
set "BufferFile=%Temp%\Buffer.txt" 
11.
set "DDLineBuffer=%Temp%\DDBuffer.txt" 
12.
 
13.
::Evtl. existierende Dateien löschen 
14.
del "%OutFile%" 2>NUL 
15.
del "%BufferFile%" 2>NUL 
16.
del "%DDLineBuffer%" 2>NUL 
17.
 
18.
::Aus der Eingabedatei alle Zeilen einlesen 
19.
for /f "tokens=1* delims=_" %%a in ('findstr "^" "%InFile%"') do ( 
20.
  set "Prefix=%%a" 
21.
 
22.
  rem Unterprogramm ProcessLine aufrufen 
23.
  rem und dessen Ausgaben in die Ausgabedatei schreiben 
24.
  >>"%OutFile%" call :ProcessLine 
25.
26.
 
27.
::Evtl. existierende Bufferdatei für DD-Zeile an die Ausgabedatei anhängen 
28.
::Notwendig falls die letzte Zeile in der Eingabedatei mit DD beginnt 
29.
if exist "%DDLineBuffer%" >>"%OutFile%" (type "%DDLineBuffer%" & echo.) 
30.
 
31.
::Evtl. existierende Bufferdatei an die Ausgabedatei anhängen 
32.
::Notwendig um den letzten Block der Eingabedatei vollständig zu schreiben 
33.
if exist "%BufferFile%" >>"%OutFile%" type "%BufferFile%" 
34.
 
35.
::Bufferdateien löschen 
36.
del "%BufferFile%" 2>NUL 
37.
del "%DDLineBuffer%" 2>NUL 
38.
 
39.
::Scriptende 
40.
exit /b 
41.
 
42.
 
43.
 
44.
::Unterprogramm 
45.
:ProcessLine 
46.
  ::Ist es eine Zeile, die mit AA beginnt? 
47.
  if "%Prefix%" equ "AA" ( 
48.
    rem Existiert die Bufferdatei schon? 
49.
    if exist "%BufferFile%" ( 
50.
      rem Ja: Bufferdatei ausgeben und danach löschen 
51.
      type "%BufferFile%" 
52.
      del "%BufferFile%" 
53.
54.
 
55.
    rem Die aktuelle Zeile ausgeben, 
56.
    rem und Rücksprung ins Hauptprogramm 
57.
    for /l %%x in (1,1,1) do echo %%a_%%b 
58.
    exit /b 
59.
60.
 
61.
  ::Ist es eine Zeile, die mit DD beginnt? 
62.
  if "%Prefix%" equ "DD" ( 
63.
    rem Wurde gerade die erste dieser Zeilen eingelesen? 
64.
    if not exist "%DDLineBuffer%" ( 
65.
      rem Ja: Zeileninhalt MIT Prefix und "_" in Bufferdatei für DD-Zeile schreiben (ohne Zeilenumbruch) 
66.
      for /l %%x in (1,1,1) do > "%DDLineBuffer%" <NUL set /p "=%%a_%%b " 
67.
    ) else ( 
68.
      rem Nein: Zeileninhalt OHNE Prefix und "_" an Bufferdatei für DD-Zeile anhängen (ohne Zeilenumbruch) 
69.
      for /l %%x in (1,1,1) do >>"%DDLineBuffer%" <NUL set /p "=%%b " 
70.
71.
 
72.
    rem Rücksprung ins Hauptprogramm 
73.
    exit /b 
74.
75.
 
76.
  ::Wenn die Zeile, die mit EE beginnt, eingelesen wurde, 
77.
  ::den Inhalt der Bufferdatei für die DD-Zeile plus Zeilenumbruch ausgeben, 
78.
  ::Bufferdatei für die DD-Zeile löschen, 
79.
  ::die aktuelle Zeile ausgeben, 
80.
  ::Rücksprung ins Hauptprogramm. 
81.
  if "%Prefix%" equ "EE" ( 
82.
    type "%DDLineBuffer%" & echo. 
83.
    del "%DDLineBuffer%" 
84.
    for /l %%x in (1,1,1) do echo %%a_%%b 
85.
    exit /b 
86.
87.
 
88.
  ::Zeilen, die durch die obigen Blöcke nicht verarbeitet wurden, 
89.
  ::in eine Bufferdatei schreiben 
90.
  for /l %%x in (1,1,1) do ( 
91.
    rem Enthält die Zeile nach dem Prefix noch weitere Zeichen? 
92.
    if "%%c" neq "" ( 
93.
      rem Ja: Alles ausgeben 
94.
      >>"%BufferFile%" echo %%a_%%b 
95.
    ) else ( 
96.
      rem Nein: Nur das Prefix oder, wenn die Zeile auch kein 
97.
      rem       Prefix enthält, eine Leerzeile ausgeben 
98.
      >>"%BufferFile%" echo\%%a 
99.
100.
101.
 
102.
::Rücksprung ins Hauptprogramm 
103.
exit /b
Ansonsten kann ich rubberman nur beipflichten, sehr abstrakt.

[EDIT]
Script geändert:
  • Die Zerlegung der Eingabedatei wird anhand der ersten x Zeichen jeder Zeile (die Prefixes, hier AA, BB, usw., nach denen ein _ kommen muss) durchgeführt.
  • Sonderzeichen in den Texten sind kein Problem, in den Prefixes schon.
  • Leere Zeilen werden übernommen.

Schönheitsfehler:
  • Die Zeile, in der die mehrfachen DD-Zeilen zusammengefasst sind, enthält als letztes Zeichen ein Leerzeichen.
[/EDIT]

Gruß
Friemler
Bitte warten ..
Mitglied: pieh-ejdsch
07.09.2011 um 10:42 Uhr
moin vvss,

falls Frimlers Script nicht tat gib mal Antwort (bzw. überhaupt mal ein Lebenszeichen).

hier ist nochwas Falls nur am Ende die Ziffern mit Strich sind.
Die Datei Draufziehen
01.
@echo off&setlocal 
02.
:: Bitte zuerst mit Testdaten Probieren 
03.
if not exist "%~1" goto :eof 
04.
findstr /r /c:"^DD_.*1-[0-9]*$" "%~1">"%~dpn1.test" 
05.
for /f "usebackq delims=" %%i in ("%~dpn1.test") do (set "Line=%%i" 
06.
	setlocal enabledelayedexpansion 
07.
	for /f "delims=" %%j in ("!NewLine!!Line!") do endlocal & set "NewLine=%%j" 
08.
09.
findstr /v /r /c:"^DD_.*1-[0-9]*$" "%~1">"%~dpn1.test" 
10.
findstr /r /c:"^AA_.*1-[0-9]*$" "%~dpn1.test" > "%~1" 
11.
setlocal enabledelayedexpansion 
12.
>>"%~1" echo !NewLine! 
13.
endlocal 
14.
findstr /r /c:"^EE_.*1-[0-9]*$" "%~dpn1.test" >> "%~1" 
15.
findstr /v /r /c:"^[ADE][ADE]_.*1-[0-9]*$" "%~dpn1.test" >> "%~1" 
16.
del  "%~dpn1.test"
Gruß Phil
Bitte warten ..
Mitglied: Lochkartenstanzer
07.09.2011 um 12:41 Uhr
Zitat von vvss:
Die neue Textdatei sollte wie dann wie folgt aussehen:

AA

Was ist mit BB und CC passiert? Sollen die nicht mit rein?

DD (1 bis xxx in einer Zeile)
EE
CC

Oder doch? Nur ein bischen?


FF
AA
DD
usw.


Danke für Eure Hilfe !!!!!

Irgendwie hast Du das Problem imho nicht genau genug beschrieben.

Ich hätte aufgrund Deiner Beschreibung einfach folgendes gemacht (in bash):
cat textdatei.txt  | gawk -F "_"  { print $1 } ' | uniq >ergebnisdatei.txt
Bitte warten ..
Mitglied: vvss
08.09.2011 um 08:54 Uhr
Hallo Zusammen,

erstmal vielen Dank für eure bisherige Hilfe. War gestern leider den ganzen Tag im Auto.
Ich habe mich vielleich doch etwas umständlich ausgedrückt. Und die Zeile BB habe ich auch vergessen, die soll nach der EE und vor der CC- Zeile ausgegeben werden.
Am Ende der Zeilen steht auch nicht AA-1 usw., sondern etwa so was: 000 00000000 0000000, mit dem AA1-1 bis AA2-1 wollte ich nur zeigen, daß bei Zeile AA ein neuer Abschnitt beginnt und das zwischen AA's zusammengehört. Daß bedeutet natürlich auch, daß nach Zeile AA2-1 ebenfalls die DD2-1 und DD2-2 evtl.DD2-3 zusammengefaßt werden müssen und unter AA2-1 stehen müssen. Gefolgt von EE2-1 und BB2-1.
Beim nächsten AA ist der Block wieder erledigt.
Asche auf mein Haupt.
Friemlers Batch finde ich den absoluten Wahnsinn, gibt es da eine Empfehlung für nen Einsteigerkurs?


Nochmals Danke an alle, für die schnelle bisherige Hilfe!!!!!

VVSS
Bitte warten ..
Mitglied: Friemler
08.09.2011 um 13:58 Uhr
Hallo -vvss-,

ich habe mein Script an Deine (nun präzisierten) Anforderungen angepasst.

Btr. Einsteigerkurs: Schau Dir mal mein Tutorial zur FOR-Schleife inkl. der Kommentare von Jeb-the-Batcher und pieh-ejdsch an.

Gruß
Friemler
Bitte warten ..
Mitglied: vvss
08.09.2011 um 18:47 Uhr
Hallo Friemler,

danke für dein schnelle Hilfe. Bei größeren Dateien werden aber leider einige DD Zeilen nicht ausgegeben.
Könnten man evtl. noch zusammenhängende Leerstellen ab 5 Stück wegschneiden, oder die ersten 33 Zeichen der einzelnen DD- Zeilen weglassen?

Habe unter http://daten.duerrbeck.com/test1.txt mal eine Testdatei ohne FF- Zeilen hinterlegt.

Ich weiß übertreibe es jetzt etwas, aber schonmal Danke.


VVSS
Bitte warten ..
Mitglied: pieh-ejdsch
08.09.2011 um 18:57 Uhr
moin vvss,

geht das komplett? auch die datei Draufziehen.
01.
@echo off&setlocal 
02.
:: Bitte zuerst mit Testdaten Probieren 
03.
if not exist "%~1" goto :eof 
04.
set "Begin=0" 
05.
set "End=0" 
06.
type nul >"%~dpn1-Neu%~x1" 
07.
for /f tokens^=1^,*^ delims^=:^  %%i in ('" findstr /r /n /c:"^AA_" "%~1" & find /v /c "" < "%~1"" ') do ( 
08.
	setlocal enabledelayedexpansion 
09.
	set /a "End = %%i - 1" 
10.
	if !Begin! equ %%i set /a "End = %%i"  
11.
	for /f "tokens=1,2" %%j in ("!Begin! !End!") do (endlocal 
12.
		set /a "Begin = %%i" 
13.
		set /a "End = %%k" 
14.
		if %%k neq 0 for /l %%l in (%%j,1,%%k) do ( 
15.
			for /f "tokens=1,2* delims=:_" %%m in ('findstr /n "^" "%~1" ^| findstr /b "%%l:" ') do (set "Line=%%o" 
16.
				setlocal enabledelayedexpansion 
17.
18.
				for /f "delims=" %%p in ("!NewLine_%%n!!Line!") do endlocal & set "NewLine_%%n=%%p" 
19.
				)||endlocal 
20.
	)	)	) 
21.
	for %%l in ("Newline_AA" "Newline_DD" "Newline_EE") do for /f "tokens=1* delims=_" %%m in ("%%~l") do (cmd /von /c if defined %%~l echo %%~n_!%%~l! 
22.
	) & set "%%~l=" 
23.
	for /f "tokens=1,2* delims=_=" %%l in ('set Newline_ 2^>nul') do set "%%l_%%m=" & echo %%m_%%n 
24.
)>>"%~dpn1-Neu%~x1"
[Edit]
Fehler Bereinigt
[/Edit]

Gruß Phil
Bitte warten ..
Mitglied: vvss
09.09.2011 um 08:57 Uhr
Moin Phil,

das Script läuft durch.
Die CC- Zeilen dürfen nicht zusammengefaßt werden, diese müssen untereinader stehen bleiben.
Ne geile Sache wäre noch, daß in den DD- Zeilen die ersten 36 Zeichen (incl. DD_) nicht mit zusammengefaßt werden.
Datei Draufziehen ist eine mir neue und faszinierende Sache, das Aufrufen einer Datei mit variabem Name in einem bestimmten Ordner würde das Script noch perfekt machen.
Je mehr ich versuche das Script halbwegs zu verstehen, desto mehr %%- Zeichen werden es, so eine ganz kurze Erläuterung, daß ich nicht ganz dumm sterbe.

Vielen Dank !!!


Gruß Veit
Bitte warten ..
Mitglied: pieh-ejdsch
09.09.2011 um 14:13 Uhr
moin vvss,

hier ist eines mit Ausfühlicher Erklärung
warum das Ding allerdings PaarPfade / Dateien nicht findet ist mir nicht klar es Tut jedenfalls
01.
 :: Der Befehl wird nicht angezeigt; Echo Ausgabe wird dektiviert und eine Lokalisierung von Variablen Beginnt 
02.
@echo off&setlocal 
03.
 
04.
:: Bitte zuerst mit Testdaten Probieren 
05.
 :: wenn der Erste (nicht unbedingt der Zweite) Parameter NICHT im Dateisystem Existiert wird der Batch nicht abgebrochen sondern Beendet 
06.
if not exist "%~1" goto :eof 
07.
 
08.
 :: Die Variablen Begin; End fürs Zeilenseparien werden gesetzt 
09.
set "Begin=0" 
10.
set "End=0" 
11.
 
12.
 :: Die Datei wird als Kopie mit dem zusatz "-Neu" im Dateinamen erstellt 
13.
type nul >"%~dpn1-Neu%~x1" 
14.
 
15.
 :: Die Forschleife gibt die Zeilennummern der Datei worin AA_ am Anfang gefunden wird nacheinander aus; zum Schluss die GesamtZeilenanzahl der Datei 
16.
for /f delims^=: %%i in ('findstr /r /n /c:"^AA_" "%~1" ^& find /v /c "" ^< "%~1"') do ( 
17.
 
18.
	 :: Die Verzögerte Variablenauflösung wird Aktiviert und eine neue Lokalisierung der Variablen beginnt 
19.
	setlocal enabledelayedexpansion 
20.
 
21.
	 :: Die ausgegebene ZeilenNummer wird minus 1 in die Variable End gesetzt 
22.
	set /a "End = %%i - 1" 
23.
 
24.
	 :: Wenn die Variable Beginn gleich der ZeilenNummer ist wird die die ZeilenNummer in die Variable End gesetzt 
25.
	if !Begin! equ %%i set /a "End = %%i" 
26.
 
27.
	 :: Diese Forschleife gibt die zur LaufZeit gültigen Variablen Begin; End in das 1. und 2. Token aus. 
28.
	 :: Die Verzögerung wird mittels beenden der Lokalisierung abgeschalten. 
29.
	for /f "tokens=1,2" %%j in ("!Begin! !End!") do (endlocal 
30.
 
31.
		 :: Die Variablen werden für spätere / weitere Nutzung gesetzt 
32.
		set /a "Begin = %%i" 
33.
		set /a "End = %%k" 
34.
 
35.
		 :: Wenn das 2. Token (ende des Absatzes) größer als 0 ist wird die Forschleife ausgeführt 
36.
		 :: Die Anfangzeilennummer; die dazwischen und die EndZeilennummer werden nacheinander ausgegeben 
37.
		if %%k neq 0 for /l %%l in (%%j,1,%%k) do ( 
38.
 
39.
			 :: die Zeilennummer des Absatzes wird gesucht; die Zeile wird im 2. ( %%n ) und 3. ( %%o ) Token ausgegeben 
40.
			 :: der Teil nach _ wird in die Variable Line gesetzt 
41.
			for /f "tokens=1,2* delims=:_" %%m in (' findstr /n "^" "%~1" 2^>nul ^| findstr /b "%%l:" 2^>nul ') do (set "Line=%%o" 
42.
			 
43.
				 :: das hatten wir schon ... 
44.
				setlocal enabledelayedexpansion 
45.
 
46.
				 :: hier die Ohne 1. 36 Zeichen im Anfang DD_ (minus 3) 
47.
				if "%%n" == "DD" set "Line=!Line:~33!"  
48.
 
49.
				 :: wenn das 2. ( %%n ) Token CC ist wird ; sonst das mit OHNE 
50.
				 :: die Variable Newline_<1.Token> und der Rest der Zeile i  AnführungsZeichen wird zu späteren Verwendung in die Variable Newline_<1.Token> gesetzt  
51.
				if "%%n" == "CC" for /f "delims=" %%p in ("!NewLine_%%n!" "!Line!") do endlocal & set "NewLine_%%n=%%p" 
52.
 
53.
				 :: hier mit OHNE AnführungsZeichen 
54.
				if not "%%n" == "CC" for /f "delims=" %%p in ("!NewLine_%%n!!Line!") do endlocal & set "NewLine_%%n=%%p" 
55.
 
56.
				 :: Ja wenn die Verzögerte Dings noch an is dann Ausmachen 
57.
				if "!os!" == "%os%" endloacal 
58.
	)	)	) 
59.
 
60.
	 :: Hier werden die Variablen in der gewünschten Reihenfolge ins Handle 3 ausgegeben und gelöscht 
61.
	for %%l in ("Newline_AA" "Newline_DD" "Newline_EE") do for /f "tokens=1* delims=_" %%m in ("%%~l") do (cmd /von /c if defined %%~l >&3 echo %%~n_!%%~l! 
62.
	) & set "%%~l=" 
63.
 
64.
	 :: Hier werden die restlichen Variablen beginnend mit Newline_ Alphabetisch ins Handle 3 ausgegeben und gelöscht 
65.
	for /f "tokens=1,2* delims=_=" %%l in ('set Newline_ 2^>nul') do for %%o in ("%%n") do for /f %%p in ("%%~o") do set "%%l_%%m=" & >&3 echo %%m_%%~o 
66.
 
67.
 :: hier wird rem benutzt damit ein letzter Befehl und Keine LeerZeile oder Kommentarzeile mit :: die SchleifenKlammer zunichte macht 
68.
 :: keine Ahnung warum der eine Datei oder nen Pfad nicht findet aber die FehlerAusgabe kommt in die Tonne 
69.
 rem schreibe alle Eingaben von Handle 3 nacheinander in die Datei 
70.
) 3>>"%~dpn1-Neu%~x1" 2>nul
Gruß Phil
Bitte warten ..
Mitglied: 99045
09.09.2011 um 15:49 Uhr
:: Bitte zuerst mit Testdaten Probieren 
 :: wenn der Zweite Parameter NICHT im Dateisystem Existiert wird der Batch abgebrochen 
if not exist "%~1" goto :eof 
Und warum wird dann der 1. und nicht der 2. Parameter überprüft?
Bitte warten ..
Mitglied: pieh-ejdsch
09.09.2011 um 16:52 Uhr
moin nick,

Ähhm ja was hab ich denn hier gemacht? Ich sach mal so soll nur der Lesetest Bestätigt werden. Schusselfehler.

Gruß Phil
Bitte warten ..
Mitglied: vvss
12.09.2011 um 11:21 Uhr
Moin Phil,

vielen Dank für deine Mühe, bin begesitert. Versuche gerade das Script zuverstehen, muß aber glaube etwas weiter auholen. Wo wir wieder bei --Tutorial zur FOR-Schleife-- wären. Werde mich mal daran machen und vieleicht sogar teilweise zur Erleuchtung kommen.


Vielen Dank an alle.
Bitte warten ..
Mitglied: vvss
20.09.2011 um 18:10 Uhr
Hallo zusammen,

habe mal versuchtdas Skript mit ein paar Pfadangaben zu erweitern.
Das scheint auch soweit zu laufen, nur die Ausgabedatei bleibt leer.
Wo ist mein Fehler?

Danke

Anbei das Skript:
01.
############################################################################################### 
02.
 
03.
 :: Der Befehl wird nicht angezeigt; Echo Ausgabe wird dektiviert und eine Lokalisierung von Variablen Beginnt 
04.
@echo on&setlocal 
05.
 
06.
:: Bitte zuerst mit Testdaten Probieren 
07.
 
08.
 :: Die Variablen werden gesetzt 
09.
set "Begin=0" 
10.
set "End=0" 
11.
set "Ausgabe=C:\SchnittstelleDBIS_Axthelm\konvertierte_Daten_Axthelm" 
12.
set "logfile=C:\SchnittstelleDBIS_Axthelm\Skripte\Axthelm1.0\file.log" 
13.
 
14.
:: Die Datei wird im Ausgabepfad mit dem Dateinamen aus der file.log neu und leer erstellt 
15.
for /F %%A in (%logfile%) do ( 
16.
	type nul >%Ausgabe%\"%%~nxA" 
17.
	set "Ausgabedatei=%Ausgabe%\%%~nxA" 
18.
	set Ausgabedatei 
19.
	set "Eingabedatei=%%A" 
20.
	set Eingabedatei 
21.
	pause	 
22.
23.
	 
24.
 
25.
 :: Die Forschleife gibt die Zeilennummern der Datei worin AA_ am Anfang gefunden wird nacheinander aus; zum Schluss die GesamtZeilenanzahl der Datei 
26.
for /f delims^=: %%i in ('findstr /r /n /c:"^AA_" "%Eingabedatei%" ^& find /v /c "" ^< "%Eingabedatei%"') do ( 
27.
 
28.
	 
29.
	 :: Die Verzögerte Variablenauflösung wird Aktiviert und eine neue Lokalisierung der Variablen beginnt 
30.
	setlocal enabledelayedexpansion 
31.
 
32.
	 :: Die ausgegebene ZeilenNummer wird minus 1 in die Variable End gesetzt 
33.
	set /a "End = %%i - 1" 
34.
	set End 
35.
	pause 
36.
	 :: Wenn die Variable Beginn gleich der ZeilenNummer ist wird die die ZeilenNummer in die Variable End gesetzt 
37.
	if !Begin! equ %%i set /a "End = %%i" 
38.
	set End 
39.
	pause 
40.
	 :: Diese Forschleife gibt die zur LaufZeit gültigen Variablen Begin; End in das 1. und 2. Token aus. 
41.
	 :: Die Verzögerung wird mittels beenden der Lokalisierung abgeschalten. 
42.
	for /f "tokens=1,2" %%j in ("!Begin! !End!") do (endlocal 
43.
 
44.
		 :: Die Variablen werden für spätere / weitere Nutzung gesetzt 
45.
		set /a "Begin = %%i" 
46.
		set /a "End = %%k" 
47.
		set Begin 
48.
		set End 
49.
		pause 
50.
		 :: Wenn das 2. Token (ende des Absatzes) größer als 0 ist wird die Forschleife ausgeführt 
51.
		 :: Die Anfangzeilennummer; die dazwischen und die EndZeilennummer werden nacheinander ausgegeben 
52.
		if %%k neq 0 for /l %%l in (%%j,1,%%k) do ( 
53.
 
54.
			 :: die Zeilennummer des Absatzes wird gesucht; die Zeile wird im 2. ( %%n ) und 3. ( %%o ) Token ausgegeben 
55.
			 :: der Teil nach _ wird in die Variable Line gesetzt 
56.
			for /f "tokens=1,2* delims=:_" %%m in (' findstr /n "^" "%Eingabedatei%" 2^>nul ^| findstr /b "%%l:" 2^>nul ') do (set "Line=%%o" 
57.
			 
58.
				 :: das hatten wir schon ... 
59.
				setlocal enabledelayedexpansion 
60.
 
61.
				 :: hier die Ohne 1. 36 Zeichen im Anfang DD_ (minus 3) 
62.
				if "%%n" == "DD" set "Line=!Line:~33!"  
63.
 
64.
				 :: wenn das 2. ( %%n ) Token CC ist wird ; sonst das mit OHNE 
65.
				 :: die Variable Newline_<1.Token> und der Rest der Zeile i  AnführungsZeichen wird zu späteren Verwendung in die Variable Newline_<1.Token> gesetzt  
66.
				if "%%n" == "CC" for /f "delims=" %%p in ("!NewLine_%%n!" "!Line!") do endlocal & set "NewLine_%%n=%%p" 
67.
							 
68.
				 :: hier mit OHNE AnführungsZeichen 
69.
				if not "%%n" == "CC" for /f "delims=" %%p in ("!NewLine_%%n!!Line!") do endlocal & set "NewLine_%%n=%%p" 
70.
						 
71.
															 
72.
				 :: Ja wenn die Verzögerte Dings noch an is dann Ausmachen 
73.
				if "!os!" == "%os%" endloacal 
74.
	)	)	) 
75.
 
76.
	 :: Hier werden die Variablen in der gewünschten Reihenfolge ins Handle 3 ausgegeben und gelöscht 
77.
	for %%l in ("Newline_AA" "Newline_DD" "Newline_EE") do for /f "tokens=1* delims=_" %%m in ("%%~l") do (cmd /von /c if defined %%~l >&3 echo %%~n_!%%~l! 
78.
	) & set "%%~l=" 
79.
 
80.
	 :: Hier werden die restlichen Variablen beginnend mit Newline_ Alphabetisch ins Handle 3 ausgegeben und gelöscht 
81.
	for /f "tokens=1,2* delims=_=" %%l in ('set Newline_ 2^>nul') do for %%o in ("%%n") do for /f %%p in ("%%~o") do set "%%l_%%m=" & >&3 echo %%m_%%~o 
82.
 
83.
  ) 3>>%Ausgabedatei% 2>nul
[Edit Biber] Codeformatierung, falls es jemand lesen will. [/Edit]
Bitte warten ..
Mitglied: Biber
20.09.2011 um 19:23 Uhr
Moin -vvss-,

wahrscheinlich stimmen Wunsch in Zeile 76 und Wirklichkeit in Zeile 77 und 81 nicht überein.

Setze doch mal das kryptische Gestrunkele "if defined %%~l >&3 " ein wenig kryptischer zu machen.
Maskiere die Sonderzeichen ">" und "&" und "3" jeweisl mit einem Caret (^)

Ziel: "if defined %%~l ^>^&^3 "

Obwohl.... wenn Batchskripte so kompliziert aussähen müssten, dann wären bis heute so drei bis fünf zum Laufen gekommen.
Wer soll den ### denn warten und pflegen?

Grüße
Biber
Bitte warten ..
Mitglied: pieh-ejdsch
20.09.2011 um 21:52 Uhr
moin -vvss-,

die extraUmleitung des Handle 3 sollte normal schon so in Ordnung sein.
&>3
Das habe ich aber nur gemacht, damit ich die Batch mit Angeschaltenem Echo Testen konnte und nur die gewünschte Ausgabe in der Datei hatte.
Wenn die Batch mit "echo off" läuft, braucht natürlich nicht erst in Handle 3 und dann von da in die Datei umgeleitet werden.

schau dir mal die Ausgabe bis zur Pause an - was wird da speziell ausgegeben? Einzelne Zeilen der Datei oder garnichts.
was steht in der "file.log" drin?

PS: den Komplett Durchkommentierten Batch brauchst Du nicht zu posten; es sollte ja nur für Dich als Erklärung der vielen Prozentzeichen dienen.

Gruß Phil
Bitte warten ..
Mitglied: vvss
21.09.2011 um 17:49 Uhr
Hallo Phil,

ich werd verrückt es funktioniert.
In file.log steht der gerade bearbeitete Dateiname drin, wenn im Eingabeorder mehrer Dateien sind werden diese nacheinander abgearbeitet.
Den Sinn von einem Handle und dem Escapen^, habe ich zwar noch nicht ganz verstanden, bleibe aber mit dem Workshop Batch for Runaways - Part II am Ball.


Danke

Veit
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Heiß diskutierte Inhalte
Router & Routing
gelöst Ipv4 mieten (22)

Frage von homermg zum Thema Router & Routing ...

Exchange Server
gelöst Exchange 2010 Berechtigungen wiederherstellen (20)

Frage von semperf1delis zum Thema Exchange Server ...

Windows Server
DHCP Server switchen (20)

Frage von M.Marz zum Thema Windows Server ...

Hardware
gelöst Negative Erfahrungen LAN-Karten (19)

Frage von MegaGiga zum Thema Hardware ...