Top-Themen

Aktuelle Themen (A bis Z)

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

Mitglied: vvss

vvss (Level 1) - Jetzt verbinden

06.09.2011 um 17:51 Uhr, 3522 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 ..
Ähnliche Inhalte
Humor (lol)

Javascript Evaluation (a gleich 1 und a gleich 2 und a gleich 3)

gelöst Frage von LochkartenstanzerHumor (lol)6 Kommentare

Viel Spaß beim Knobeln: Can (a 1 && a 2 && a3) ever evaluate to true? lks Du hast ...

CSS

Row gleich hoch

Frage von pcguyCSS10 Kommentare

Hallo zusammen, ich habe eine Frage betreffend bootstrap row. Ich habe folgende Einteilung: Die Bilder sind responsive, da sie ...

Batch & Shell

EQU - GLEICH - BATCH

gelöst Frage von freshman2017Batch & Shell9 Kommentare

Hallo, im nachfolgendem Batch: GTR mit EQU ersetzen, also EQU Mustermann OR Musterfrau OR Fraumuster. Also wenn in %%r ...

Windows 8

Textdatei umformatieren

gelöst Frage von bladeyyyWindows 81 Kommentar

Hey, Ich habe folgendes Problem: Ein Programm exportiert bei mir eine Textdatei in dem Format: erste Zeile mit unnötigem ...

Neue Wissensbeiträge
Windows 7

Windows 7 u. Server 2008 (R2) SHA-2-Update kommt am 12. März 2019

Information von kgborn vor 10 StundenWindows 73 Kommentare

Kleine Info für die Admins der oben genannten Maschinen. Ab Juli 2019 werden Updates von Microsoft nur noch mit ...

Firewall
PfSense 2.5.0 benötigt doch kein AES-NI
Information von ChriBo vor 2 TagenFirewall2 Kommentare

Hallo, Wie sich einige hier erinnern werden hat Jim Thompson in diesem Aritkel beschrieben, daß ab Version 2.5.0 ein ...

Internet
Copyright-Reform: Upload-Filter
Information von Frank vor 3 TagenInternet1 Kommentar

Hallo, viele Menschen reden aktuell von Upload-Filtern. Sie reden darüber, als wären es eine Selbstverständlichkeit, das Upload-Filter den Seitenbetreibern ...

Google Android

Blokada: Tracking und Werbung unter Android unterbinden

Information von AnkhMorpork vor 3 TagenGoogle Android1 Kommentar

In Ergänzung zu meinem vorherigen Beitrag: Blokada efficiently blocks ads, tracking and malware. It saves your data plan, makes ...

Heiß diskutierte Inhalte
Backup
Wo installiert man Veeam bei SoHo?
Frage von EDVMan27Backup16 Kommentare

Hallo, nachdem ich die neue Veeam CE bei mir getestet habe, wollte ich es einmal bei einem Kunden testen. ...

Hyper-V
Intel MSC Raid 5 Rebuild
Frage von DannysHyper-V16 Kommentare

Hallo Community, Ich habe einen Modul Server von Intel in Betrieb. Dort ist eine Festplatte aus dem Raid 5 ...

Netzwerkmanagement
Richtfunknetzwerk mit vielen Hops stabiler gestalten
Frage von turti83Netzwerkmanagement15 Kommentare

Hallo, in meinem Dorf habe ich vor ca. einem Jahr ein Backbone aufgebaut um die Nachbarschaft mit Internet zu ...

Windows Server
DFSR - Dateireplikationseinstellung - Festplattenauslastung zu hoch - optimale Einstellungsfrage
Frage von Kamelle01Windows Server12 Kommentare

Hallo liebe Mitglieder, ich habe einen Windows Server 2016 mit 4TB 7200U 256MB SATA Festplatten in RAID10 und einem ...