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

Ersetzen der dritten Zeile mit einem fest definierten Text und Auslesen eines Datums aus Textzeile

Frage Entwicklung Batch & Shell

Mitglied: hamburgrulez

hamburgrulez (Level 1) - Jetzt verbinden

01.06.2011 um 17:19 Uhr, 3788 Aufrufe, 25 Kommentare

Hallo an alle Forenmitglieder und freundlichen Helfer des Forums!

Ich bekomme jeden Tag eine Datei aus einem Bankenprogramm, dass ich in ein Buchhaltungsprogramm importieren möchte.
Dabei muss eine bestimmte Zeile dieser Textdatei mit einem fest definierten Wert überschrieben werden, damit das Buchhaltungsprogramm keine doppelten Kontoauszüge moniert.
Außerdem möchte ich das Datum, welches sich ebenfalls in einer Zeile der Importdatei befindet, auslesen und danach automatisch an den Dateinamen hängen und die modifizierte Datei abspeichern.
Über Google und auch mit der Suchfunktion des Forums bin ich leider nicht fündig geworden.
Ich möchte das Problem mit Hilfe von Windows Bordmitteln (BATCH-Datei) lösen, bin aber über die üblichen BATCH-Befehle hinaus nicht so sehr fit darin.

Die Importdatei sieht so aus:

:20:STARTUMS
:25:20050815/123456789
:28C:00010/001
:60F:C110531EUR1234,99
:61:1105310531CR219,01NTRFNONREF
:86:051?00UEBERWEISUNG?100000123454678987
:61:110531sdkjfghsdfjkh,9NTRFNONREF
:86:051?00UEBERWEISUNG?100000sflkvjasjklfhjklasdhf
:61:110531053jkshdfjkasdhfjkhsdjkfh
:86:051?00UEBERWEISUNG?100000skdfajksgfkasgdfag
:61:1105310ysöMit freundlichen Grüßenkasjasjasdklögjakls
:86:051?00UEBERWEISUNG?100000asdfzsuiadfzuiasfz
:62F:C110531EUR1asdlifhasdjl
-

Relevant sind nur die
Zeile 3 :28C:00010/001 (Wert, der überschrieben werden soll)
Zeile 4 :60F:C110531EUR1234,99 (Datumsangabe zum Auslesen und an die modifizierte Datei hängen)

Die Zeile 3 soll dabei immer mit dem Wert
:28C:00000/001
überschrieben werden.

Die Datei
123456789_BANK.sta
soll anschließend so aussehen:
123456789_BANK_110531.sta

Alle anderen Werte sollen natürlich unverändert bleiben.

Kann mir da jemand helfen?
Mitglied: bastla
01.06.2011 um 17:55 Uhr
Hallo hamburgrulez und willkommen im Forum!

Sind ":28C:" und ":60F:C" konstant und eindeutig, oder muss tatsächlich auf die Zeilennummer abgestellt werden?
Enthält die Datei Sonderzeichen?

Grüße
bastla
Bitte warten ..
Mitglied: Friemler
01.06.2011 um 18:28 Uhr
Hallo hamburgrulez,

mein Vorschlag zur Lösung des Problems:
01.
@echo off 
02.
 
03.
setlocal 
04.
 
05.
 
06.
set "SrcFile=%~1" 
07.
set "DestFileName=%~dpn1" 
08.
set "DestFileExt=%~x1" 
09.
 
10.
set "ReplaceStr=:28C:00000/001" 
11.
 
12.
 
13.
::Datum extrahieren 
14.
for /f "eol= tokens=1,2* delims=:" %%j in ('findstr /n "^" "%SrcFile%"') do ( 
15.
  if "%%j" equ "4" ( 
16.
    for /f "eol= tokens=1* delims=0123456789" %%a in ("%%l") do ( 
17.
      set "Line=%%l" 
18.
      set "LeadingChars=%%a" 
19.
      set "TrailingChars=%%b" 
20.
      call :GetDate 
21.
22.
23.
24.
 
25.
 
26.
::Zieldatei schreiben 
27.
for /f "eol= tokens=1* delims=:" %%k in ('findstr /n "^" "%SrcFile%"') do ( 
28.
  if "%%k" neq "3" ( 
29.
    >>"%DestFileName%_%aDate%%DestFileExt%" echo\:%%l 
30.
  ) else ( 
31.
    >>"%DestFileName%_%aDate%%DestFileExt%" echo\%ReplaceStr% 
32.
33.
34.
 
35.
exit /b 
36.
 
37.
 
38.
 
39.
::Hilfs-Prozedur 
40.
:GetDate 
41.
call set "aDate=%%Line:*%LeadingChars%=%%" 
42.
call set "aDate=%%aDate:%TrailingChars%=%%" 
43.
exit /b
Das Icon der Quelldatei kann auf das Icon des Batchscripts gezogen werden. Die Ausgabedatei wird im Verzeichnis der Quelldatei erstellt.

Es wird davon ausgegangen, dass in Zeile 4 der Quelldatei vor dem Datum immer ein oder mehrere Zeichen stehen, die keine Zahl sind und nach dem Datum als erstes wieder ein Zeichen steht, was keine Zahl ist. Bei der Ausgabe wird davon ausgegangen, dass alle Zeilen mit einem Doppelpunkt anfangen.

Fragen zur Funktionsweise werden gerne beantwortet.

@bastla: Wenn man Laufvariablen innerhalb von FOR-Schleifen mit ECHO ausgibt, kann der Inhalt der Laufvariablen sogar &, %, < und > enthalten, zumindest unter Windows 7, XP nicht getestet.

Gruß
Friemler
Bitte warten ..
Mitglied: bastla
01.06.2011 um 20:32 Uhr
@Friemler
... und mit "delayedexpansion" sowieso (und nein, VBS erwähne ich gar nicht ) ...

... nur weiß das vermutich der TE nicht - wenn daher schon eine umfangreiche Beschreibung (erfreulicher Weise auch gleich einmal mit Beispieldaten ) erfolgt, hätte ich mir diese Information ebenso erwartet wie etwa einen Hinweis, dass das gesuchte Datum immer an Position 6 beginnt (weil der Teil davor gleich bleibt oder zumindest immer die gleiche Struktur aufweist) ...

Grüße
bastla
Bitte warten ..
Mitglied: Friemler
02.06.2011 um 14:42 Uhr
Hallo bastla,

mit delayedexpansion wird, wenn der Inhalt der Laufvariablen ein Ausrufezeichen enthält, dieses nicht ausgegeben .

Gruß
Friemler
Bitte warten ..
Mitglied: bastla
02.06.2011 um 14:49 Uhr
Hallo Friemler!

"delayedexpansion" würde ich auch nur verwenden, wenn eine Stringmanipulation erforderlich ist (und auch da erst bei der Ausgabe) - also etwa (ungetestet) für die Datumszeile, um die Zeichen 7-12 zu isolieren:
01.
... 
02.
    set "Zeile=%%i" 
03.
    setlocal enabledelayedexpansion 
04.
    echo !Zeile:~6,6! 
05.
    endlocal 
06.
    ...
Grüße
bastla
Bitte warten ..
Mitglied: hamburgrulez
04.06.2011 um 23:36 Uhr
Zitat von bastla:
Hallo hamburgrulez und willkommen im Forum!

Sind ":28C:" und ":60F:C" konstant und eindeutig, oder muss tatsächlich auf die Zeilennummer abgestellt
werden?
Enthält die Datei Sonderzeichen?

Grüße
bastla

Hallo an alle,
wow, so schnell habe ich gar nicht mit sovielen Antworten und gleich fertigen Lösungsansätzen gerechnet!
Ich bin zwar jetzt nicht im Büro und kann deshalb nicht mit Gewissheit sagen, ob die beiden Zeichenfolgen konstant sind, doch mit ziemlich hoher Wahrscheinlichkeit kann ich das bestätigen. Ich werde aber Montag nochmal genau nachschauen. Auch den Lösungsansatz kann ich leider erst Montag ausprobieren.
Ich gebe ein Feedback, sobald ich das ausprobiert habe!

Schönen Dank schonmal bis hierhin!
Bitte warten ..
Mitglied: hamburgrulez
06.06.2011 um 11:11 Uhr
Zunächst einmal die Bestätigung dafür, dass die ersten vier Zeilen immer die gleiche Struktur und den gleichen Aufbau haben wie in meiner Beispieldatei oben zu sehen.
Ich verwende übrigens Win7.

Ich habe nun auch den Lösungsansatz von Friemler ausprobiert - funktioniert!

Ich bin begeistert! Allerdings weiß ich beim besten Willen nicht, wie da die Hauptfunktionsweisen (Start der Funktion per Drag&Drop, Ändern der Zeile 3, Anhängen des ausgelesenen Datums) funktionieren. Könntest Du da noch ein paar REM-Kommentare mit Erläuterungen ins Programm einbauen?
Ich würde es gern soweit verstehen, dass ich bei kleineren Änderungen der Quelldateien selbst Hand anlegen kann...

Vielen Dank nochmal an alle Beteiligten der Lösungsfindung!
Bitte warten ..
Mitglied: hamburgrulez
06.06.2011 um 12:21 Uhr
Zitat von Friemler:
Bei der Ausgabe wird davon ausgegangen, dass alle Zeilen mit einem Doppelpunkt anfangen.

Hallo Friemler,

da habe ich doch glatt Deinen Hinweis überlesen, dass ALLE Zeilen mit einem Doppelpunkt anfangen.
Für die ersten 4 Zeilen gilt dieser Grundsatz aber für den Rest ist das leider nicht immer so (der Teufel steckt im Detail).

Können wir das Programm nicht dahingehend ändern, dass ab Zeile 5 alles unverändert übernommen wird?
Bitte warten ..
Mitglied: Friemler
06.06.2011 um 12:52 Uhr
Hallo hamburgrulez,

die Funktionsweise erkläre ich Dir gerne, allerdings nicht als Quelltextkommentare, da das, wie Du siehst, ewas umfangreicher wird und das Script kaum noch lesbar wäre.

Wenn Du das Icon der Quelldatei auf das Icon des Batchfiles ziehst, wird der Dateiname der Quelldatei inkl. Pfad dem Batchfile als Parameter übergeben. Der erse Parameter eines Batchfiles lässt sich über %1 ansprechen, der zweite über %2 usw. bis %9. An weitere Parameter kommt man dann nur noch nach Verwendung des Befehls SHIFT heran, durch den %1 mit dem Wert, den vorher %2 hatte, belegt wird. %9 ist dann der zehnte Parameter. SHIFT lässt sich auch mehrfach anwenden.

In Zeile 6 steht set "SrcFile=%~1". Die Tilde bewirkt, das evtl. umgebende Anführungszeichen vom ersten Parameter entfernt werden. Das set "DestFileName=%~dpn1" in Zeile 7 extrahiert Laufwerk (d), Pfad (p) und Name (n) ohne Dateierweiterung aus dem ersten Parameter. set "DestFileExt=%~x1" in Zeile 8 extrahiert die Dateierweiterung (x).

Der FINDSTR-Befehl in Zeile 14 sucht wegen "^" nach allen Zeilen mit einem Anfang, findet also alle Zeilen. Wegen /n setzt er vor jede gefundene Zeile die Zeilennummer mit einem nachfolgenden Doppelpunkt .

Die Ausgabe von FINDSTR wird von der FOR-Schleife in ihre Bestandteile (Tokens) zerlegt. Mit eol= wird verhindert, dass das standardmäßig als Zeilenendezeichen (EOL=End Of Line) definierte Semikolon die Verarbeitung einer Dateizeile abbricht, indem als EOL-Zeichen nichts definiert wird. Wegen delims=: wird der Doppelpukt als Trennzeichen zwischen den Bestandteilen interpretiert. Wegen tokens=1,2* werden von FOR drei Tokens zur Verfügung gestellt:

  1. Die Zeilennummer in der Laufvariablen %%j. Danach kommen zwei Doppelpunkt (Trennzeichen), einer von FINDSTR erzeugt, der zweite ist Inhalt Deiner Datei.
  2. Die automatisch erzeugte Laufvariable %%k enthält das, was nach dem initialen Doppelpunkt am Zeilenanfang in Deiner Datei steht bis zum zweiten Doppelpunkt (exklusiv).
  3. Die ebenfalls automatisch wegen dem Stern erzeugte Laufvariable %%l enthält alles nach dem zweiten Doppelpunkt einer Zeile Deiner Datei.

Wegen 1. kann ich also in Zeile 15 ermitteln, ob gerade die vierte Dateizeile eingelesen wurde (equ heißt equal -> gleich). Die wird dann von der FOR-Schleife in Zeile 16 in ihre Bestandteile (Tokens) zerlegt. Als Trennzeichen werden hier wegen delims=0123456789 alle Ziffern definiert. Wegen tokens=1* sind also in der Laufvariablen %%a alle Zeichen vor dem Datum gepeichert und in der automatisch erzeugten Laufvariablen %%b der Rest der Zeile nach dem Datum. Aus diesem Grund habe ich auch geschrieben:

Zitat von Friemler:
Es wird davon ausgegangen, dass in Zeile 4 der Quelldatei vor dem Datum immer ein oder mehrere Zeichen stehen, die keine Zahl sind und nach dem Datum als erstes wieder ein Zeichen steht, was keine Zahl ist.

In den Zeilen 17 bis 19 werden die Laufvariablen an normale Variablen zugewiesen. Um es anhand der beispielhaften Daten aus Deinem Eingangsposting zu erklären:

  • %Line% enthält C110531EUR1234,99
  • %LeadingChars% enhält C
  • %TrailingChars% enthält EUR1234,99

Dann wird das Unterprogramm GetDate aufgerufen.

Wegen dem Stern in call set "aDate=%%Line:*%LeadingChars%=%%" in Zeile 41 wird vom Anfang von Line alles abgeschnitten (oder besser gesagt, durch nichts ersetzt), was LeadingChars entspricht und alles, was davor steht.

=> aDate enthält jetzt 110531EUR1234,99

Dadurch könnten auch mehrere Zeichen vor dem Datum stehen, allerdings dürfen keine Ziffern dabei sein .

Zeile 42 ist ein ähnlicher Ausdruck, enthält jedoch keinen Stern. Deshalb wird aDate nach allen Stellen abgesucht, die TrailingChars entsprechen und diese Stellen durch nichts ersetzt.

=> aDate enthält jetzt 110531

Dann geht es mit exit /b zurück ins Hauptprogramm (die FOR-Schleife). Wegen Zeile 15 wird das ganze nur für Zeile 4 Deiner Datei ausgeführt, der Rest wird überlesen.

In Zeile 27 wird Deine Datei nochmals eingelesen. Wegen tokens=1* enthält nun die Laufvariable %%k die Zeilenummer in der Datei und die automatisch erzeugte Laufvariable %%l alles nach dem initialen Doppelpunkt jeder Dateizeile. Wegen delims=: ist ja wieder der Doppelpunkt als Trennzeichen zwischen den Tokens definiert.

In Zeile 28 wird geprüft, ob gerade eine andere Zeile als Zeile 3 eingelesen wurde (neq heißt not equal -> nicht gleich). Wenn ja, wird der initiale Doppelpunkt (der wurde ja herausgefiltert) und dann der Rest der Zeile (%%l) wegen >> an die Datei angehängt , deren Name in %DestFilename% gespeichert ist (natürlich ergänzt um _%aDate% und die Dateierweiterung).

Wenn Zeile 3 eingelesen wurde, wird im ELSE-Zweig in Zeile 31 der Ersetzungsstring aus %ReplaceString% an die Datei angehängt.

Der Backslash (\) nach dem ECHO-Befehl in Zeile 31 würde, falls %ReplaceString% leer ist, eine Leerzeile in die Datei schreiben.Hintergrund: Wenn %ReplaceString% leer ist, würde der Befehl ohne den Backslash als echo übersetzt, was dann den Text "ECHO ist eingeschaltet (On)." in die Datei schreiben würde. Ein kleines Schmankerl des Praktikanten, der die Shell programmiert hat.

Beim ECHO-Befehl in Zeile 29 ist der Backslash eigentlich überflüssig, da ja immer mindestens ein Doppelpunkt in die Datei geschrieben wird.

Du siehst ja, viel Erklärung für ein paar Zeilen (kompakten) Code. Deshalb habe ich eigentlich mein Tutorial zur FOR-Schleife geschrieben. Bei jedem Batchneuling solche Romane zu schreiben ist lästig. Aber Du hast Dich hier höflich und freundlich verhalten, deshalb eine Ausnahme. Bei weiteren Fragen (die evtl. auch erst bei Anpassungen des Codes auftreten) und im Tuorial schon beantwortet werden, kann ich das aber nicht nochmal machen.

Gruß
Friemler
Bitte warten ..
Mitglied: Friemler
06.06.2011 um 12:57 Uhr
Hallo hamburgrulz,

klar, lässt sich machen. Ersetze die Zeilen 28 bis 30 durch
01.
if "%%k" neq "3" ( 
02.
  if "%%k" leq "4" ( 
03.
    >>"%DestFileName%_%aDate%%DestFileExt%" echo\:%%l 
04.
  ) else ( 
05.
    >>"%DestFileName%_%aDate%%DestFileExt%" echo\%%l 
06.
07.
) else (
Gruß
Friemler


[EDIT]
Hm, Mist. Damit wird ab Dateizeile 5 auf keinen Fall ein initialer Doppelpunkt geschrieben! Da der Doppelpunkt ein Trennzeichen ist, ist diese Anforderung auch nicht so einfach zu erfüllen. Muss ich nochmal drüber meditieren.
[/EDIT]
Bitte warten ..
Mitglied: hamburgrulez
06.06.2011 um 13:11 Uhr
Friemler, ich bin tief beeindruckt!

Vielen, vielen Dank dafür, dass Du Dir soviel Mühe mit meinem Problem und der umfangreichen Erklärung des Programmcodes gegeben hast!!
Ich werde mich ganz sicher mit Deinem Tutorial beschäftigen!
Bitte warten ..
Mitglied: Friemler
06.06.2011 um 13:25 Uhr
Gern geschehen.

Falls Du meine Erklärung zusammen mit dem Script speichern willst - jetzt ist sie endgültig, ich hatte noch ein paar unklare Formulierungen und Rechtschreibfehler drin.

Gruß
Friemler
Bitte warten ..
Mitglied: hamburgrulez
06.06.2011 um 13:54 Uhr
Zitat von Friemler:
Hallo hamburgrulz,

klar, lässt sich machen. Ersetze die Zeilen 28 bis 30 durch
01.
> if "%%k" neq "3" ( 
02.
>   if "%%k" leq "4" ( 
03.
>     >>"%DestFileName%_%aDate%%DestFileExt%" echo\:%%l 
04.
>   ) else ( 
05.
>     >>"%DestFileName%_%aDate%%DestFileExt%" echo\%%l 
06.
>   ) 
07.
> ) else ( 
08.
> 
Gruß
Friemler


Es tut mir Leid schon wieder zu nerven aber nach der vorgeschlagenen Änderung (ich habe die Zeilen 28 bis 30 des alten Quellcodes durch die neuen Zeilen ersetzt) haben die Änderung am Programm leider nicht zum gewünschten Erfolg, sondern vielmehr zu zusätzlicher Verwirrung geführt, weil das Programm nun anscheinend willkürlich die vorangestellten Doppelpunkte setzt oder entfernt.

Original:

:20:STARTUMS
:25:21050815/123456000
:28C:106/001
:60F:C110601EUR123456,12
:61:1125644587F6584,6HTEW000000000 00601900000587964
:86:099?00DTA SAMMEL-UEBERW.-AUFTRAG?1026987?20DATENTRAEGERAUSTAU
SCHAUFTRA?21V.01.06.2011 NR. 395874?258 UEBERWEISUNGEN?23DFUE MIT
ELEKT.UNTERSCHRIFT?32MAX MUSTER GMBH U. CO. KG?34999
:61:1101234567W5508,11NMSCNONREF
G236123456781405
:86:004?00LASTSCHRIFTEN (ABBUCHUNGSV.?1029987?202001234567 SPAM.
FOLLOWS?3051234567?311234567004?32EUROMUELL DEUTSCHLAND GM?34999

Modifikation:

:20:STARTUMS
:25:21050815/123456000
:28C:00000/001
:60F:C110601EUR123456,12
61:1125644587F6584,6HTEW000000000 00601900000587964
86:099?00DTA SAMMEL-UEBERW.-AUFTRAG?1026987?20DATENTRAEGERAUSTAU
SCHAUFTRA?21V.01.06.2011 NR. 395874?258 UEBERWEISUNGEN?23DFUE MIT
ELEKT.UNTERSCHRIFT?32MAX MUSTER GMBH U. CO. KG?34999
61:1101234567W5508,11NMSCNONREF
G236123456781405
:86:004?00LASTSCHRIFTEN (ABBUCHUNGSV.?1029987?202001234567 SPAM.
:FOLLOWS?3051234567?311234567004?32EUROMUELL DEUTSCHLAND GM?34999

Irgendeine Idee, warum nicht der gewünschte Erfolg eintritt?
Bitte warten ..
Mitglied: Friemler
06.06.2011 um 14:06 Uhr
Hallo hamburgrulez,

siehe das Edit meines vorletzten Posting.

Dass ab Zeile 10 wieder Doppelpunkte auftauchen liegt daran, dass die Zeilennummern wegen der umgebenden Anführungszeichen als Strings verglichen werden, nicht als Zahlen. Deshalb ist 10 kleiner 4. Damit es richtig wird, müsste man 10 und 04 vergleichen.

Aber entferne mal die Anführungszeichen bei allen Vergleichen von Zeilennummern mit konstanten Zahlen, sollte dann auch gehen. Um das Übernehmen von vorhandenen Doppelpunkten ab Zeile 5 kümmere ich mich noch.

Gruß
Friemler
Bitte warten ..
Mitglied: hamburgrulez
06.06.2011 um 14:36 Uhr
Zitat von Friemler:
Hallo hamburgrulz,

klar, lässt sich machen. Ersetze die Zeilen 28 bis 30 durch
01.
> if "%%k" neq "3" ( 
02.
>   if "%%k" leq "4" ( 
03.
>     >>"%DestFileName%_%aDate%%DestFileExt%" echo\:%%l 
04.
>   ) else ( 
05.
>     >>"%DestFileName%_%aDate%%DestFileExt%" echo\%%l 
06.
>   ) 
07.
> ) else ( 
08.
> 
Gruß
Friemler


[EDIT]
Hm, Mist. Damit wird ab Dateizeile 5 auf keinen Fall ein initialer Doppelpunkt geschrieben! Da der Doppelpunkt ein
Trennzeichen ist, ist diese Anforderung auch nicht so einfach zu erfüllen. Muss ich nochmal drüber meditieren.
[/EDIT]

Ich habe jetzt die Anführungszeichen bei
"%%k" neq "3"
jeweils entfernt, doch es gab da keine Lösung des Problems. Je nachdem wo ich Anführungszeichen weglasse werden entweder vor allen Zeilen KEINE Doppelpunkte gesetzt oder es werden ÜBERALL welche gesetzt.
Aber die Übertragung des Textes 1:1 wird bislang nicht erreicht.
Bitte warten ..
Mitglied: Friemler
06.06.2011 um 14:57 Uhr
Hallo hamburgrulez,

hier jetzt nochmal das komplette Script in einer angepassten Version:
01.
@echo off 
02.
 
03.
setlocal 
04.
 
05.
 
06.
set "SrcFile=%~1" 
07.
set "DestFileName=%~dpn1" 
08.
set "DestFileExt=%~x1" 
09.
 
10.
set "ReplaceStr=:28C:00000/001" 
11.
 
12.
 
13.
::Datum extrahieren 
14.
for /f "eol= tokens=1,2* delims=:" %%j in ('findstr /n "^" "%SrcFile%"') do ( 
15.
  if %%j equ 4 ( 
16.
    for /f "eol= tokens=1* delims=0123456789" %%a in ("%%l") do ( 
17.
      set "Line=%%l" 
18.
      set "LeadingChars=%%a" 
19.
      set "TrailingChars=%%b" 
20.
      call :GetDate 
21.
22.
23.
24.
 
25.
 
26.
::Zieldatei schreiben 
27.
for /f "eol= delims=" %%l in ('findstr /n "^" "%SrcFile%"') do ( 
28.
  for /f "eol= tokens=1* delims=:" %%a in ("%%l") do ( 
29.
    if %%a neq 3 ( 
30.
      (echo\%%l|findstr "^[0-9]*::" > NUL) && ( 
31.
        >>"%DestFileName%_%aDate%%DestFileExt%" echo\:%%b 
32.
      ) || ( 
33.
        >>"%DestFileName%_%aDate%%DestFileExt%" echo\%%b 
34.
35.
    ) else ( 
36.
      >>"%DestFileName%_%aDate%%DestFileExt%" echo\%ReplaceStr% 
37.
38.
39.
40.
 
41.
exit /b 
42.
 
43.
 
44.
 
45.
::Hilfs-Prozedur 
46.
:GetDate 
47.
call set "aDate=%%Line:*%LeadingChars%=%%" 
48.
call set "aDate=%%aDate:%TrailingChars%=%%" 
49.
exit /b
Tjaa, da gibt es wieder was zu erklären .

Die Methode des Einlesens der Quelldatei bei der Ausgabe hat sich nicht geändert (Zeile 27). Allerdings ließt diese FOR-Schleife jetzt erstmal die gesamte Zeile inkl. Zeilennummer und nachfolgendem Doppelpunkt ein und stellt das in %%l zur Verfügung. Erst die FOR-Schleife in Zeile 28 führt die Zerlegung in Tokens anhand des Doppelpunkts als Trennzeichen durch. Die Zeilennummer ist jetzt in %%a gespeichert, der Zeileninhalt in %%b, jedoch ohne initialen Doppelpunkt.

In Zeile 30 wird der Zeileninhalt, inkl. Zeilennummer mit nachfolgendem Doppelpunkt (stammt von FINDSTR in Zeile 27) ausgegeben. Dann wird ein weiterer FINDSTR-Befehl angewiesen nachzuschauen, ob die Zeile mit Zahlen (der Zeilennummer) beginnt und danach zwei Doppelpunkte kommen. Das ganze ist ein regulärer Ausdruck. ^ heißt
"am Zeilenanfang", [0-9] ist die Klasse der Ziffern von 0 bis 9, die durch den nachfolgenden * beliebig oft vorkommen dürfen und von zwei Doppelpunkten gefolgt sein müssen. Die Ausgabe von FINDSTR wird durch > NUL nicht ausgegeben.

Wenn FINDSTR das Suchmuster gefunden hat, liefert es 0 als Rückgabewert zurück, ansonsten einen Wert ungleich 0. Dieser Rückgabewert wird von den Operatoren zur bedingten Befehlsausführung && und || in den Zeilen 30 und 32 verarbeitet. && führt die Befehle (in der Klammer) danach aus, wenn der Rückgabewert 0 ist, || führt nachfolgende Befehle aus, wenn der Rückgabewert ungleich 0 ist.

Kleine Änderung der Anforderungen => Du musst noch mehr komplizierten Batchscript-Code verstehen.

Das mit den fehlerhaften Zahlenvergleichen tut mir leid, verschusselt und nicht richtig getestet.

Gruß
Friemler
Bitte warten ..
Mitglied: Friemler
06.06.2011 um 14:59 Uhr
Hallo hamburgrulez,

siehe mein letztes Posting.

Gruß
Friemler
Bitte warten ..
Mitglied: hamburgrulez
06.06.2011 um 15:16 Uhr
Friemler, Du hast heute definitiv Deine gute Tat des Tages hinter Dich gebracht - es funktioniert!

Sei nochmals bedankt für Deine intensive Bemühung um Lösung des Problems und die umfangreiche Kommentierung!
Ich hätte im Leben nicht damit gerechnet, dass es so umfangreich sein würde eine popelige Zeile mit einem fixen Wert zu überschreiben und ausgelesene Werte in den Dateinamen zu übernehmen...
Bitte warten ..
Mitglied: Friemler
06.06.2011 um 15:45 Uhr
Hallo hamburgrulez,

ich habe das Script nochmal geändert. Die Erkennung von einem Doppelpunkt am Zeilenanfang ist jetzt sicherer und beschränkt sich wirklich auf den Zeilenanfang. Das ließ mir bei einer Geschichte für Bank-/Geschäftsdaten dann doch keine Ruhe.

Gruß
Friemler
Bitte warten ..
Mitglied: bastla
06.06.2011 um 15:49 Uhr
Hallo hamburgrulez!
Ich hätte im Leben nicht damit gerechnet, dass es so umfangreich sein würde
Du hattest doch BATCH haben wollen ...

Grüße
bastla
Bitte warten ..
Mitglied: hamburgrulez
06.06.2011 um 17:02 Uhr
Ja, ich wollte BATCH, weil flexibler im Einsatz aber anscheinend nicht so sehr bei der Erstellung... ;)

Und nochmal danke für die "Nachbesserung"!
Bitte warten ..
Mitglied: Friemler
06.06.2011 um 17:14 Uhr
Hallo hamburgrulez,

ist die Sache damit dann gelöst? Dann setze doch bitte noch den grünen Haken.

Gruß
Friemler
Bitte warten ..
Mitglied: hamburgrulez
08.06.2011 um 11:05 Uhr
Das Script funktioniert wirklich gut!
Nun wollte ich noch etwas Feintuning machen und dem Programm mitteilen, dass die ursprünglich eingelesene Datei nach Ende der gesamten Prozedur gelöscht wird, so dass ich das nicht immer von Hand machen muss.
Um bei dem eingangs geschilderten Beispiel mit der Datei 123456789_BANK.sta zu bleiben, soll eben genau diese also am Ende gelöscht werden.

Ich habe es bereits mit dem del-Befehl probiert und habe diese Zeile ganz ans Ende des Scriptes gehängt:

del "SrcFile" /s

Aber das funktioniert nicht - die Datei bleibt unberührt bestehen. Ich habe es übrigens auch ohne Anführungszeichen um SrcFile probiert mit dem gleichen Erfolg.
Wenn ich das Programm richtig verstehe, wird doch am Anfang des Programms die Quelldatei, die ich über die Batch-Anweisung per Drag&Drop ziehe als SrcFile definiert. Warum funktioniert dann meine Lösch-Anweisung nicht?
Bitte warten ..
Mitglied: Friemler
08.06.2011 um 11:24 Uhr
Hallo hamburgrulez,

Du musst schreiben:
del "%SrcFile%"
Wenn Du den Inhalt einer Variablen in Batchscript verwenden willst, musst Du den Variablenbezeichner in Prozentzeichen einschließen. Nur bei einer Zuweisung eines Wertes an eine Variable müssen die Prozentzeichen weggelassen werden.

Das /s lass' mal lieber weg. Diesen Parameter verwendet man, um alle Dateien und Unterverzeichnisse im übergebenen Verzeichnis zu löschen...

Gruß
Friemler
Bitte warten ..
Mitglied: hamburgrulez
08.06.2011 um 11:36 Uhr
Danke Friemler, das war (mal wieder) der entscheidende Tipp - es funktioniert!
Bitte warten ..
Neuester Wissensbeitrag
Microsoft

Lizenzwiederverkauf und seine Tücken

(5)

Erfahrungsbericht von DerWoWusste zum Thema Microsoft ...

Ähnliche Inhalte
Batch & Shell
gelöst Poweshell Script soll String ersetzen und die leere Zeile löschen (4)

Frage von Mars123 zum Thema Batch & Shell ...

Installation
gelöst Mit Powershell in einer Datei eine Zeile auslesen (6)

Frage von Bommi1961 zum Thema Installation ...

Heiß diskutierte Inhalte
Windows Netzwerk
Windows 10 RDP geht nicht (16)

Frage von Fiasko zum Thema Windows Netzwerk ...

Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Microsoft Office
Keine Updates für Office 2016 (13)

Frage von Motte990 zum Thema Microsoft Office ...