hoygrodo
Goto Top

Datei auslesen und in andere Datei schreiben und mit Datum versehen

Es muss eine txt.Datei ausgelesen werden, in der mehrere Zeilen existieren.

Innerhalb der Zeilen kommt z.B. die Zeichenfolge 000008082539 vor. Identisch sind dabei immer die ersten 7 Zeichen, also 0000080.

Die komplette Zahl muss ausgelesen werden und in eine andere txt-Datei geschrieben werden.

Hinter diesem Eintrag muss dann das aktuelle Datum mit Uhrzeit erscheinen - also z.B. 000008082539 01.03.2007 14:12.

Die Zieldatei muss fortlaufend benannt werden.

Eine Kopie dieser Datei muss in ein Backup-Verzeichnis gelegt werden.


Wie kriege ich das in eine Batchdatei, die unter Windows 2000 läuft?

Gruß,

HoyGroDo

Content-Key: 52945

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

Printed on: April 19, 2024 at 21:04 o'clock

Member: Randyman
Randyman Mar 01, 2007 at 13:30:34 (UTC)
Goto Top
Hi,

um die Zeichenfolge zu finden eigenet sich am besten das tool grep; stammt von Unix, gibts aber auch für Windows (googeln).

Datum und Uhrzeit dranhängen sollte kein Problem sein (date /T, time /T)

Damit sollte sich das dann verwirklichen lassen.

Gruss
Randy
Member: HoyGroDo
HoyGroDo Mar 01, 2007 at 14:03:06 (UTC)
Goto Top
Ich bräuchte allerdings ein batch-file-script, da ich den Vorgang per Task automatisieren muss.
Member: bastla
bastla Mar 01, 2007 at 14:14:25 (UTC)
Goto Top
Hallo HoyGroDo!

  • Der Beginn der Zeichenfolge ist am String "0000080" zu erkennen - wie findet man das Ende?
  • Kommt die Zeichenfolge in der Quelldatei einmal oder mehrmals vor?
  • Die gefundene Zeichenfolge (inkl Datum und Uhrzeit) soll in eine andere Textdatei geschrieben werden, diese muss fortlaufend benannt sein - daher für jede gefundene Zeichenfolge eine einzelne, aufsteigend nummerierte Datei?
  • Wenn ja, welches Format soll der Dateiname haben?

  • Und: Spricht etwas gegen die Verwendung des für eine derartige Aufgabenstellung besser geeigneten VBScript?

Grüße
bastla
Member: Randyman
Randyman Mar 01, 2007 at 14:16:28 (UTC)
Goto Top
schon klar; das grep musst du dann aus der batch aufrufen.

Randy
Member: HoyGroDo
HoyGroDo Mar 01, 2007 at 14:27:22 (UTC)
Goto Top
Hallo HoyGroDo!

  • Der Beginn der Zeichenfolge ist am String
"0000080" zu erkennen - wie findet
man das Ende?
Die Zeichenfolge ist immer 12 Zeichen lang mit anschließendem Leerzeichen.

* Kommt die Zeichenfolge in der Quelldatei
einmal oder mehrmals vor?
Die Zeichenfolge 0000080 kommt mehrfach vor - die jeweilige Endung ist immer unterschiedlich.

* Die gefundene Zeichenfolge (inkl Datum und
Uhrzeit) soll in eine andere Textdatei
geschrieben werden, diese muss fortlaufend
benannt sein - daher für jede gefundene
Zeichenfolge eine einzelne, aufsteigend
nummerierte Datei?
In der Quelldatei kommen mehrere Zeichenfolgen vor, die gemeinsam in eine neue txt-Datei geschrieben werden sollen. Innerhalb der Textdatei sollen Datum und Zeit hinter die ausgelesene Zeichenfolge geschrieben werden.


* Wenn ja, welches Format soll der Dateiname
haben?

  • Und: Spricht etwas gegen die Verwendung
des für eine derartige Aufgabenstellung
besser geeigneten VBScript?
Bin nicht sicher, ob das in diesem Fall unterstützt wird ?!?


Gruß,
HoyGroDo
Member: Biber
Biber Mar 01, 2007 at 14:30:16 (UTC)
Goto Top
...und, ergänzend zu bastla's Nachfragen:

  • steht der Suchstring jeweils am Zeilenanfang oder irgendwo in einer 2850 Zeichen langen Zeile?
  • Die Zieldatei: Steht die irgendwo oder in einem bestimmten Verzeichnis? hat die vor der Nummerierung auch irgendeinen Namen? Wie gross wird der Nummernkreis? Von 001 bis 999? Von 00000001 bis 999999999?
  • Ist es schlau, jeweils nach der "kompletten Zahl" Datum und Uhrzeit zu schreiben? Bei 777 Fundstellen 777mal? Dasselbe Datum incl. Uhrzeit pappt doch ohnehin "aussen" an der Datei dran als "Erstellungsdatum"?
  • Eine Kopie ins Backup-Verzeichnis? Hä? Das hat doch aber nichts mit diesem Suchstring-Zirkus zu tun? Ich mache doch nicht von jeder neu erzeugten Datei in Echtzeit sofort ein Backup?

Gruss
Biber
Member: HoyGroDo
HoyGroDo Mar 01, 2007 at 14:45:51 (UTC)
Goto Top
...und, ergänzend zu bastla's
Nachfragen:

  • steht der Suchstring jeweils am
Zeilenanfang oder irgendwo in einer 2850
Zeichen langen Zeile?
steht am Anfang der Zeile - aber nur in jeder zweiten Zeile

* Die Zieldatei: Steht die irgendwo oder in
einem bestimmten Verzeichnis? hat die vor der
Nummerierung auch irgendeinen Namen? Wie
gross wird der Nummernkreis? Von 001 bis 999?
Von 00000001 bis 999999999?
Die Datei existiert vorher noch nicht. Datei soll dann in einem Unterverzeichnis des selben Pfads stehen. Der Nummernkreis ist: 000000001 bis 99999999.


* Ist es schlau, jeweils nach der
"kompletten Zahl" Datum und Uhrzeit
zu schreiben? Bei 777 Fundstellen 777mal?
Dasselbe Datum incl. Uhrzeit pappt doch
ohnehin "aussen" an der Datei dran
als "Erstellungsdatum"?
Die Zieldatei wird noch weiterverarbeitet und muss die Angabe in jeder Zeile enthalten.
Format: 28.12.06 17:32 Uhr

* Eine Kopie ins Backup-Verzeichnis?
Hä? Das hat doch aber nichts mit diesem
Suchstring-Zirkus zu tun? Ich mache doch
nicht von jeder neu erzeugten Datei in
Echtzeit sofort ein Backup?
Leider doch, da die Zieldatei übermittelt wird und nicht mehr am Zielort vorliegt.

Gruß,
HoyGroDo
Member: NKourtidis
NKourtidis Mar 01, 2007 at 15:02:25 (UTC)
Goto Top
Hallo,

um die datei fortlaufend zu schreiben, musst Du die Dateien erstmal zählen1 Das geht mit
for /r c:\temp\ %i in (*.*) do set /a x +=1
Hier im Beispiel im Verzeichnis "c:\temp\" und die Anzahl steht dann in der Variablen "x"
Dann nimmst Du die Datei mit den Zeilen die Du auswerten möchtest und zählst diese auf und schreibst die Zeilen gleich mit Datum und Uhrzeit in die neue Datei

for /f "eol=; tokens=1" %i in (dateiname.???) do echo %i %date% %time% >c:\temp_%x%.log

Wenn Du das in einem Batch schreibst, musst Du die %-zeichen doppelt schreiben!!

Gruß aus Köln
Member: bastla
bastla Mar 01, 2007 at 15:02:30 (UTC)
Goto Top
Hallo HoyGroDo!

Zum Dateinamen:
  • Besteht dieser nur aus der Nummer (ab "000000001") und einer Extension (".txt")?
  • Wie komme ich zur letzten verwendeten Nummer - aus den Dateinamen im Backup-Ordner auslesen?
  • Wenn ja: Befinden sich in diesem Ordner nur die nummerierten Dateien?

  • Alternativ böte sich die Speicherung der letzten Nummer in einer Textdatei an.

Grüße
bastla
Member: NKourtidis
NKourtidis Mar 01, 2007 at 15:05:13 (UTC)
Goto Top
ups ich war etwas zu tief, also nochmal:

Hallo,

um die datei fortlaufend zu schreiben, musst Du die Dateien erstmal zählen1 Das geht mit

for /r c:\temp\ %i in (*.*) do set /a x +=1

Hier im Beispiel im Verzeichnis "c:\temp\" und die Anzahl steht dann in der Variablen "x"
Dann nimmst Du die Datei mit den Zeilen die Du auswerten möchtest und zählst diese auf und schreibst die Zeilen gleich mit Datum und Uhrzeit in die neue Datei

for /f "eol=; tokens=1" %i in (dateiname.???) do echo %i %date% %time% >c:\temp_%x%.log

Wenn Du das in einem Batch schreibst, musst Du die %-zeichen doppelt schreiben!!

Gruß aus Köln
Member: HoyGroDo
HoyGroDo Mar 01, 2007 at 15:13:49 (UTC)
Goto Top
Hallo HoyGroDo!

Zum Dateinamen:
  • Besteht dieser nur aus der Nummer (ab
"000000001") und einer Extension
(".txt")?
Der Dateiname der Quelldatei sieht wie folgt aus: abcd1234.abc
Der Dateiname der Zieldatei sieht wie folgt aus: 000000001.txt

* Wie komme ich zur letzten verwendeten
Nummer - aus den Dateinamen im Backup-Ordner
auslesen?
Das wäre ein guter Ansatz face-smile

* Wenn ja: Befinden sich in diesem Ordner
nur die nummerierten Dateien?
Ja, dort befinden sich nur diese Dateien.


  • Alternativ böte sich die Speicherung
der letzten Nummer in einer Textdatei an.
Oder so face-smile


Gruß,
HoyGroDo
Member: bastla
bastla Mar 01, 2007 at 15:28:06 (UTC)
Goto Top
Hallo HoyGroDo!

Versuch es einmal so:
@echo off & setlocal
set ZielOrdner=Z:\Test
set BackupOrdner=Z:\Backup
set String=0000080
set Nr=
for /f %%i in ('dir "%BackupOrdner%" /b /o-n') do if not defined Nr set /a Nr=%%~ni  
set /a Nr +=1000000001
set ZielDatei=%Nr:~-9%.txt
for /f %%i in ('findstr "%String%" "%1"') do echo %%i %date% %time:~0,5% Uhr>>"%ZielOrdner%\%ZielDatei%"  
copy "%ZielOrdner%\%ZielDatei%" "%BackupOrdner%\%ZielDatei%"  
Speichere die Batchdatei nach Anpassung der Pfade in den ersten beiden Zeilen zB unter "D:\Bearbeite.bat" und rufe sie mit
D:\Bearbeite.bat abcd1234.abc
auf.

Grüße
bastla
Member: Biber
Solution Biber Mar 01, 2007, updated at Jun 09, 2015 at 19:41:03 (UTC)
Goto Top
...und (wieder mal ergänzend zu bastla), je nachdem ob
  • in der Regel immer dieselbe Quelldatei x-mal nach verschiedenen Suchstrings durchflöht werden soll oder
  • x verschiedene Quelldateien nach immer wieder dem gleichen Suchstring,
sollte auch der Wert der Variablen "String" als Parameter vorgesehen werden.

::Bearbeite.bat Parameter1=Quelldateiname Parameter2=Suchstring
@echo off & setlocal
set ZielOrdner=Z:\Test
set BackupOrdner=Z:\Backup
<b>Set "String=%2"  
if [%2]== set "String=0000080"</b>  
Set Nr=
for /f %%i in ('dir "%BackupOrdner%" /b /o-n') do if not defined Nr set /a Nr=%%~ni  
set /a Nr +=1000000001
set ZielDatei=%Nr:~-9%.txt
for /f %%i in ('findstr "%String%" "%1"') do echo %%i %date% %time:~0,5% Uhr>>"%ZielOrdner%\%ZielDatei%"  
copy "%ZielOrdner%\%ZielDatei%" "%BackupOrdner%\%ZielDatei%"  
REM Tippfehlerkorrektur s.u.; ALT:<i> copy "%ZielOrdner%\%ZielDatei%" "%BackupOrdner%\%ZielDatei</i>  

Mögliche Aufrufe dann:
D:\Bearbeite.bat abcd1234.abc
D:\Bearbeite.bat abcd1234.abc 0000080
for %i in (0000081 0000082 0000099) do call D:\Bearbeite.bat abcd1234.abc %i
for %i in (abcd0001 abcd1234 abcd7777) do D:\Bearbeite.bat %i 0000080
...etc

Gruss Biber
P.S. Mit meiner Frage nach: "hat die [Zieldatei] vor der Nummerierung auch irgendeinen Namen?" meinte ich das, was bastla verständlicher formuliert hat: "Besteht dieser nur aus der Nummer (ab "000000001") und einer Extension (".txt")? "
Member: HoyGroDo
HoyGroDo Mar 02, 2007 at 20:49:37 (UTC)
Goto Top
Hallo!

Wenn ich das Skript so laufen lasse wird aber im Zielordner nur eine Datei mit Namen "000000001.txt" und im Backupordner nur eine Datei mit Namen "ZielDatei" angelegt.
Führe ich das Skript ein zweites Mal aus, dann wird das neue Ergebnis in die beiden Datei fortgeschrieben.
Ich bräuchte allerdings bei jedem Lauf des Skripts eine neue Datei mit fortlaufendem Namen im Ziel- und Backupordner.

Gruß,
HoyGroDo
Member: bastla
bastla Mar 02, 2007 at 20:56:30 (UTC)
Goto Top
Hallo HoyGroDo!

Bei Biber's Version ist das abschließende %-Zeichen in der "copy"-Zeile verloren gegangen - wenn Du es ergänzt, sollte es mit dem Kopieren und allen weiteren Durchläufen klappen.

Grüße
bastla
Member: HoyGroDo
HoyGroDo Mar 02, 2007 at 21:02:11 (UTC)
Goto Top
Hallo bastla!

Das hilft zumindest bei der Benennung der Datei weiter - beide heißen jetzt "000000001.txt" im ersten Durchlauf.
Aber im zweiten Lauf wird die Information wieder in die gleiche Datei dazu geschrieben.

Das Skript sieht bei mir so aus:

@echo off & setlocal
set ZielOrdner=C:\Test
set BackupOrdner=C:\Test\Backup
Set "String=%2"
if [%2]== set "String=0000080"
Set Nr=000000000
for /f %%i in ('dir "%BackupOrdner%" /b /o-n') do if not defined Nr set /a Nr=%%~ni
set /a Nr +=1000000001
set ZielDatei=%Nr:~-9%.txt
for /f %%i in ('findstr "%String%" "%1"') do echo %%i %date% %time:~0,5% Uhr>>"%ZielOrdner%\%ZielDatei%"
copy "%ZielOrdner%\%ZielDatei%" "%BackupOrdner%\%ZielDatei%

Der Aufruf erfolgt so: c:\Bearbeite.bat test.txt 0000080

Wie kann man nun jeweils eine neue Datei bei der Ausgabe erhalten?

HoyGroDo
Member: bastla
Solution bastla Mar 02, 2007, updated at Jun 09, 2015 at 19:40:56 (UTC)
Goto Top
Hallo HoyGroDo!

Ändere die Zeile
Set Nr=000000000
auf
Set Nr=
wie oben gezeigt - nur so kann die folgende Abfrage "if not defined Nr" funktionieren ...

Außerdem solltest Du in der "copy"-Zeile auch noch das schließende Anführungszeichen ans Ende setzen (hatte ich vorher nicht erwähnt, sorry) - dies für den Fall, dass Dein Backup-Pfad einmal eine Leerstelle enthalten könnte.

Grüße
bastla
Member: HoyGroDo
HoyGroDo Mar 02, 2007 at 21:13:22 (UTC)
Goto Top
Super - klappt!

Vielen Dank für die schnelle Hilfe !!!!!

Gruß,
HoyGroDo