wolff
Goto Top

TXT-Datei mit Batch trennen - Dateiname und Inhalt aus diesem File generieren

Guten Morgen zusammen face-smile

ich habe gestern Biber schon per PN gefragt ob er mir bei meinem Problem helfen könnte und er meinte, es wäre ein interessantes und nützliches Thema, das ruhig öffentlich gelöst werden sollte face-smile

Mein Problem ist folgendes:
Ich bekomme automatisch generierte SMS auf meine UMTS-Karte.
Diese SMS werden mit einer Software empfangen und in eine einzige Datei
geschrieben.

Der Aufbau der Datei ist wie folgt:
2007-10-08 15:31:48'02 SMS: +4917112345678 2007-10-08 14:47:06 [08]

Hier steht der Text mit max. 160 Zeichen

Zur Erklärung:
Erst das Empfangsdatum mit Uhrzeit, gefolgt von dem Typ, Handynummer des
Senders, Datum der SMS und Uhrzeit der SMS sowie GSM-Code.
Anschließend eine Leerzeile und der SMS-Text und wieder eine Leerzeile.

Ich brauche ein Script, dass es mir erlaubt die Handynummer, die Absendezeit
und das Absendedatum in Variablen zu speichern um damit eine Verzeichnisstruktur
anlegen zu können %Handynummer%\%Datum%\

Die Uhrzeit soll der Dateiname werden und der Inhalt der Datei soll der Text
werden.

Der Sinn ist die Archivierung der Daten(SMS) nach Rufnummer.


Falls es für jemanden interessant ist, kann ich auch gerne Erklären welche Programme ich nehme und wie das Senden/Empfangen der SMS funktioniert.
Vielleicht braucht ja auch jemand so eine Lösung!?

Viele Grüße

Content-Key: 70551

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

Printed on: April 23, 2024 at 18:04 o'clock

Member: bastla
bastla Oct 10, 2007 at 10:59:31 (UTC)
Goto Top
Hallo Wolff!

Woran ist die Kopfzeile sicher zu erkennen? Befindet sich zB in jeder derartigen Zeile die Zeichenfolge "'02 SMS:", möglichst auch noch ab Position 20, oder muss man/frau sich darauf verlassen, dass sie jeweils auf die zweite Leerzeile folgt?

Außerdem: Wird jede Handynummernvorwahl mit führendem "+" angegeben?

Grüße
bastla
Member: Wolff
Wolff Oct 10, 2007 at 11:05:34 (UTC)
Goto Top
Die Handynummer wird immer im internationalen Format angegeben...also immer mit + allerdings kann die Länge unterschiedlich sein, da es ja in Deutschland verschieden lange Handynummern gibt.

Die Zeichenfolge der Kopfzeile ist immer wie im Beispiel, also Datum Uhrzeit plus "SMS" und danach der Rest.

Wenn man alle Leerzeilen entfernt, wäre es immer die ungerade Zeile...also 1,3,5...
In der geraden Zeile steht immer der Text.
Member: bastla
bastla Oct 10, 2007 at 11:32:32 (UTC)
Goto Top
Hallo Wolff!

Wenn man alle Leerzeilen entfernt, wäre es immer die ungerade Zeile...also 1,3,5...
Unter dieser Voraussetzung könnte es so klappen:
@echo off & setlocal
set "Quelle=D:\SMS.txt"  
set "Ziel=D:\SMS-Ablage"  

set Kopf=True
for /f "usebackq delims=" %%i in ("%Quelle%") do set "Zeile=%%i" & call :ProcessLine  
goto :eof

:ProcessLine
set "Zeile=%Zeile:>=^>%"  
set "Zeile=%Zeile:<=^<%"  
if not defined Kopf (echo %Zeile%)>>"%Datei%" & set Kopf=True & goto :eof  

for /f "usebackq tokens=2 delims=+" %%l in ('echo %Zeile:'=%') do for /f "tokens=1-3" %%a in ('echo %%l') do set "Nr=%%a" & set "Datum=%%b" & set "Zeit=%%c"  
if not exist "%Ziel%\%Nr%" md "%Ziel%\%Nr%"  
if not exist "%Ziel%\%Nr%\%Datum%" md "%Ziel%\%Nr%\%Datum%"  
set "Datei=%Ziel%\%Nr%\%Datum%\%Zeit::=.%.txt"  
set Kopf=

Grüße
bastla

[Edit] echo %Zeile:'=% verwendet, um störendes Apostroph zu eliminieren. [/Edit]
[Edit2] Handling für "<" und ">" im Text ergänzt. [/Edit2]
Member: Wolff
Wolff Oct 10, 2007 at 11:42:13 (UTC)
Goto Top
Das hat mir schon mal sehr weitergeholfen und funktioniert auch gut (Dateien und Verzeichnisse).

Aber die Dateien sind leer, es fehlt also der Text der SMS face-sad

Kannst du mir das in ganz groben Zügen mal erklären?


Viele Grüße
Daniel
Member: bastla
bastla Oct 10, 2007 at 12:13:47 (UTC)
Goto Top
Hallo Wolff!

Vorweg: Mit meinen Testdaten, die ich aus deinem Eröffnungsposting entnommen habe, funktioniert es (auch schon vor der unten angesprochenen Änderung).

set Kopf=True
Da die Zeilen abwechselnd "Kopf" und "Text" sind, verwende ich einen Schalter, um die jeweils nächste Zeile zu charakterisieren.

for /f "usebackq delims=" %%i in ("%Quelle%") do set "Zeile=%%i" & call :ProcessLine  
Mit dieser Schleife werden alle Zeilen der Quelldatei einzeln behandelt, wobei Leerzeilen ignoriert werden. Es wird zunächst die Zeile in einer Variablen zwischengespeichert und dann das Unterprogramm zur eigentlichen Bearbeitung aufgerufen.

if not defined Kopf (echo %Zeile%)>>"%Datei%" & set Kopf=True & goto :eof  
Wenn der Schalter "Kopf" anzeigt, dass jetzt keine Kopfzeile vorliegt, sollte eigentlich der Text in die durch die Variable %Datei% vorgegebene Zieldatei geschrieben werden. Der Schalter wird dann für die nächste Zeile wieder auf "Kopf" gesetzt und das Unterprogramm verlassen.

Auch wenn dieser Teil anscheinend tut, was er soll, eine kurze Erläuterung (und eine Ergänzung):
for /f "usebackq tokens=2 delims=+" %%l in ('echo %Zeile:'=%') do for /f "tokens=1-3" %%a in ('echo %%l') do set "Nr=%%a" & set "Datum=%%b" & set "Zeit=%%c"  
Das erste "for" teilt die Zeile unter Verwendung des "+" als Trennzeichen und verwendet den zweiten Teil der Zeile.
Mit dem zweiten "for" wird dieser Teil weiter zerlegt. Da die einzelnen Bestandteile durch Leerzeichen getrennt sind, muss kein spezieller "Delimiter" angegeben werden. Die ersten 3 Teile werden den entsprechenden Variablen zugewiesen.

Da die Kopfzeile ein "'" enthält, habe ich in diese Zeile (auch im Batch oben) noch etwas verändert, um das Apostroph auszufiltern.

if not exist "%Ziel%\%Nr%" md "%Ziel%\%Nr%"  
if not exist "%Ziel%\%Nr%\%Datum%" md "%Ziel%\%Nr%\%Datum%"  
Falls das Zielverzeichnis noch nicht existiert, wird es hier erstellt. Eigentlich muss dies nicht schrittweise erfolgen, so dass Du die erste dieser beiden Zeilen auch ersatzlos streichen kannst.

set "Datei=%Ziel%\%Nr%\%Datum%\%Zeit::=.%.txt"  
Da in einem Dateinamen ein ":" nicht zulässig ist, wird dieser durch "." ersetzt und der Name der Zieldatei samt Pfad in eine Variable geschrieben.

set Kopf=
Die nächste Zeile ist keine Kopfzeile, daher Schalter "Kopf" löschen.
Zur Fehlersuche könntest Du zunächst das "@echo off" auf "@echo on" ändern und dann den Batch so aufrufen:
Batchname > Log.txt
Anhand der "Log.txt" kannst Du dann den Ablauf nachvollziehen.

Grüße
bastla
Member: Wolff
Wolff Oct 10, 2007 at 12:33:23 (UTC)
Goto Top
Vielen Dank für diese echt super Erklärung!

Also mit meinem Test-Text geht es face-smile da hast du vollkommen Recht.

Ich vermute mal, dass es an den Sonderzeichen der Status-SMS liegt face-sad
Manchmal ist da ein "<" oder ">" drin bzw. am Anfang ein "<LANG>" wenn die SMS gesplittet wurde weil es mehr als 160 Zeichen waren.

Lässt dich das trotzdem irgendwie verarbeiten oder ist das gar nicht der Fehler?
Mir ist nur aufgefallen, dass es ohne diese Zeichen problemlos funktioniert *freu*

Viele Grüße
Daniel
Member: bastla
bastla Oct 10, 2007 at 12:41:58 (UTC)
Goto Top
Hallo Wolff!

Ich ergänze den Batch oben um das Handling für "<" und ">".

Grüße
bastla
Member: Wolff
Wolff Oct 16, 2007 at 11:09:56 (UTC)
Goto Top
läuft alles perfekt!!!
vielen dank für diese super hilfe!!!