TXT-Datei mit Batch trennen - Dateiname und Inhalt aus diesem File generieren
Guten Morgen zusammen
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
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
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 70551
Url: https://administrator.de/contentid/70551
Ausgedruckt am: 20.11.2024 um 10:11 Uhr
8 Kommentare
Neuester Kommentar
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
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
Hallo Wolff!
Grüße
bastla
[Edit] echo %Zeile:'=% verwendet, um störendes Apostroph zu eliminieren. [/Edit]
[Edit2] Handling für "<" und ">" im Text ergänzt. [/Edit2]
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]
Hallo Wolff!
Vorweg: Mit meinen Testdaten, die ich aus deinem Eröffnungsposting entnommen habe, funktioniert es (auch schon vor der unten angesprochenen Änderung).
Da die Zeilen abwechselnd "Kopf" und "Text" sind, verwende ich einen Schalter, um die jeweils nächste Zeile zu charakterisieren.
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.
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):
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.
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.
Da in einem Dateinamen ein ":" nicht zulässig ist, wird dieser durch "." ersetzt und der Name der Zieldatei samt Pfad in eine Variable geschrieben.
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:
Anhand der "Log.txt" kannst Du dann den Ablauf nachvollziehen.
Grüße
bastla
Vorweg: Mit meinen Testdaten, die ich aus deinem Eröffnungsposting entnommen habe, funktioniert es (auch schon vor der unten angesprochenen Änderung).
set Kopf=True
for /f "usebackq delims=" %%i in ("%Quelle%") do set "Zeile=%%i" & call :ProcessLine
if not defined Kopf (echo %Zeile%)>>"%Datei%" & set Kopf=True & goto :eof
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"
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%"
set "Datei=%Ziel%\%Nr%\%Datum%\%Zeit::=.%.txt"
set Kopf=
Zur Fehlersuche könntest Du zunächst das "@echo off" auf "@echo on" ändern und dann den Batch so aufrufen:
Batchname > Log.txt
Grüße
bastla