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

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

Frage Entwicklung Batch & Shell

Mitglied: Wolff

Wolff (Level 1) - Jetzt verbinden

10.10.2007, aktualisiert 16.10.2007, 5576 Aufrufe, 8 Kommentare

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
Mitglied: bastla
10.10.2007 um 12:59 Uhr
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
Bitte warten ..
Mitglied: Wolff
10.10.2007 um 13:05 Uhr
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.
Bitte warten ..
Mitglied: bastla
10.10.2007 um 13:32 Uhr
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:
01.
@echo off & setlocal 
02.
set "Quelle=D:\SMS.txt" 
03.
set "Ziel=D:\SMS-Ablage" 
04.
 
05.
set Kopf=True 
06.
for /f "usebackq delims=" %%i in ("%Quelle%") do set "Zeile=%%i" & call :ProcessLine 
07.
goto :eof 
08.
 
09.
:ProcessLine 
10.
set "Zeile=%Zeile:>=^>%" 
11.
set "Zeile=%Zeile:<=^<%" 
12.
if not defined Kopf (echo %Zeile%)>>"%Datei%" & set Kopf=True & goto :eof 
13.
 
14.
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" 
15.
if not exist "%Ziel%\%Nr%" md "%Ziel%\%Nr%" 
16.
if not exist "%Ziel%\%Nr%\%Datum%" md "%Ziel%\%Nr%\%Datum%" 
17.
set "Datei=%Ziel%\%Nr%\%Datum%\%Zeit::=.%.txt" 
18.
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]
Bitte warten ..
Mitglied: Wolff
10.10.2007 um 13:42 Uhr
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

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


Viele Grüße
Daniel
Bitte warten ..
Mitglied: bastla
10.10.2007 um 14:13 Uhr
Hallo Wolff!

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

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

01.
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.

01.
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):
01.
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.

01.
if not exist "%Ziel%\%Nr%" md "%Ziel%\%Nr%" 
02.
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.

01.
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.

01.
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:
01.
Batchname > Log.txt
Anhand der "Log.txt" kannst Du dann den Ablauf nachvollziehen.

Grüße
bastla
Bitte warten ..
Mitglied: Wolff
10.10.2007 um 14:33 Uhr
Vielen Dank für diese echt super Erklärung!

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

Ich vermute mal, dass es an den Sonderzeichen der Status-SMS liegt
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
Bitte warten ..
Mitglied: bastla
10.10.2007 um 14:41 Uhr
Hallo Wolff!

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

Grüße
bastla
Bitte warten ..
Mitglied: Wolff
16.10.2007 um 13:09 Uhr
läuft alles perfekt!!!
vielen dank für diese super hilfe!!!
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
Batch-Variable nach Stichworten aus TXT Datei durchsuchen (3)

Frage von Markus5579 zum Thema Batch & Shell ...

Batch & Shell
CMD-Batch hilfe: Dateiname zu txt (2)

Frage von Syscore64 zum Thema Batch & Shell ...

Batch & Shell
Ungewöhnliche Txt.Datei-Abfrage mit Batch (3)

Frage von DaTobsn zum Thema Batch & Shell ...

Webentwicklung
gelöst HTML Output in eine txt Datei mit VisualBasicScript (2)

Frage von coca22COCA zum Thema Webentwicklung ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (17)

Frage von liquidbase zum Thema Windows Update ...