tg6300
Goto Top

String aus Textdatei in Datum umwandeln

Hallo zusammen,

ich stecke nicht so in der Batch-Programmierung drin und fand ach bei Google nicht den passenden Ansatz.
Deshalb möchte ich mich jetzt an euch wenden. Es geht um das folgende Problem:

Eine Textdatei hat viele Zeilen mit folgender Struktur:

user1 (Wed Mar 27 10:15:00 2019)
user2 (Tue Apr 02 06:20:15 2019)
user3 (Tue Apr 02 09:38:37 2019)
user4 (Fri Mar 29 09:37:27 2019)
user5 (Thu Mar 28 20:39:51 2019)

und so weiter...


Ich möchte jetzt das Datum (in der Klammer) so umrechnen, dass man über das Datum bestimmte Zeilen rausfiltern kann
und davon den Usernamen (die ersten Zeichen bis zum Leerzeichen) in eine Variable packen, um diese in einem Script weiterzuverwenden.

Vorher hab ich schon mit "for /n" experimentiert, komme aber dort nicht weiter.
Habt ihr da eventuell eine Idee, wie man das lösen kann?

Vielen Dank im Voraus.

Content-Key: 573162

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

Printed on: April 26, 2024 at 17:04 o'clock

Member: beidermachtvongreyscull
beidermachtvongreyscull May 20, 2020 at 07:43:42 (UTC)
Goto Top
Moin,

bei diesem Aufbau würde ich eher daran denken, die Datei nach Excel zu importieren und da zu filtern.

bdmvg
Mitglied: 144260
144260 May 20, 2020 updated at 13:11:01 (UTC)
Goto Top
Batch kennt keinen Datums-Datentyp, und für sowas sowas nimmt man heute gleich die Powershell
$file = 'D:\test.txt'  
$data = gc $file | ?{$_.trim() -match '^\s*([^\s]+)\s*\(([^\)]+)\)'} | select @{n='Username';e={$matches[1]}},@{n='Date';e={[datetime]::ParseExact($matches[2],'ddd MMM dd HH:mm:ss yyyy',[cultureinfo]::InvariantCulture)}}  
$data
Das Ergebnis kannst du dann filtern bis der Arzt kommt, z.B.
$data | ?{$_.Date -lt (get-date '01.04.2019')}  
Member: tg6300
tg6300 May 20, 2020 at 11:56:01 (UTC)
Goto Top
Vielen Dank für die schnelle Antwort.
Hab dein Script mal auf die Datei losgelassen, aber leider scheint die Variable leer zu sein.

Eigentlich sollte doch der Inhalt der txt-Datei mit formatierten Datum in der Variable stehen, oder sehe ich das falsch?
Mitglied: 144260
144260 May 20, 2020 updated at 12:58:24 (UTC)
Goto Top
Zitat von @tg6300:

Vielen Dank für die schnelle Antwort.
Hab dein Script mal auf die Datei losgelassen, aber leider scheint die Variable leer zu sein
Wurde mit deinen Daten die du hier (leider ohne Codetags) gepostet hast natürlich vorher erfolgreich getestet!
user1 (Wed Mar 27 10:15:00 2019)
user2 (Tue Apr 02 06:20:15 2019)
user3 (Tue Apr 02 09:38:37 2019)
user4 (Fri Mar 29 09:37:27 2019)
user5 (Thu Mar 28 20:39:51 2019)
Der Regex wurde darauf angepasst, wenn die Daten also nicht exakt so da stehen kann ich nur nachfragen was an der Textdatei anders ist (Deswegen immer Codetags verwenden!), irgendwelche Leerzeichen am Zeilenanfang, nicht sichtbare Sonderzeichen usw.

Eigentlich sollte doch der Inhalt der txt-Datei mit formatierten Datum in der Variable stehen, oder sehe ich das falsch?
In der Variablen Data befindet sich nach Durchlauf der Textdatei Objekte mit den Eigenschaften Username und Date. Wenn das nicht der Fall ist hast du das Skript nicht korrekt angewendet oder die Ausgabgsdaten sind nicht so wie sie oben stehen.

Und NEIN, das ist kein Batch sondern Powershell falls du das überlesen haben solltest.
Member: tg6300
tg6300 May 20, 2020 at 13:06:04 (UTC)
Goto Top
Sorry, es war mein Fehler. Ich habe nur den für mich interessanten Teil geschrieben (user1...).
Die Datei hat noch einiges in den Kopfzeilen stehen face-sad.

Usage data is 6 minutes old. Next update in 10 minutes.

Feature  : XDT_ENT_UD          
Installed: 111          Installed Overdraft  : 111    
In Use   : 111         Users: 111    Devices: 111    

  Version  : 2020.0326 
  Installed: 55         Installed Overdraft  : 5     
  In Use   : 55         Users: 24     Devices: 31    
    Users:
      user1 (Wed Mar 27 10:15:00 2019)
      user2 (Tue Apr 02 06:20:15 2019)
      user3 (Tue Apr 02 09:38:37 2019)
      user4 (Fri Mar 29 09:37:27 2019)
      user5 (Thu Mar 28 20:39:51 2019)

Wie kann ich jetzt die unterschiedlichen vorgestellten Leerzeichen entfernen, oder bei der Abfrage ignorieren?

Ja, ich habe es gelesen, dass es hier um Powershell geht face-wink.
Member: miniversum
miniversum May 20, 2020 updated at 13:08:32 (UTC)
Goto Top
Hallo,
Du willst einfach nur "über das Datum bestimmte Zeilen rausfiltern"?
Dann versuchs doch mit findstr und evtl. regular expressions:
findstr /R /C:"(.* Apr 02 .* 2019)" Datei.txt  
oder etwas schöner aufbereitet:
set dd=02
set mmm=Apr
set yyyy=2019
set file=Datei.txt
findstr /R /C:"(.* %mmm% %dd% .* %yyyy%)" %file%  

Gruß
...
Mitglied: 144260
144260 May 20, 2020 updated at 13:14:40 (UTC)
Goto Top
Zitat von @tg6300:

Sorry, es war mein Fehler. Ich habe nur den für mich interessanten Teil geschrieben (user1...).
Die Datei hat noch einiges in den Kopfzeilen stehen face-sad.
Wie kann ich jetzt die unterschiedlichen vorgestellten Leerzeichen entfernen, oder bei der Abfrage ignorieren?
Code ist oben an deine Situation angepasst
Member: tg6300
tg6300 May 20, 2020 at 14:00:32 (UTC)
Goto Top
Jetzt passt die Abfrage. Wenn ich aber die Variable so abfrage:

$data |  ?{$_.Date -lt (get-date '29.03.2019')}  

bekomme ich folgendes Ergebnis:

user1          27.03.2019 10:15:00
user2          28.03.2019 20:39:51
user3          27.03.2019 10:14:49
user4          22.03.2019 09:33:54
user5          26.03.2019 08:42:53
user6          28.03.2019 10:30:12

Warum sucht er auch andere Daten raus (27.03., 28.04.)??
Mitglied: 144260
144260 May 20, 2020 updated at 14:09:57 (UTC)
Goto Top
Weil -lt bedeutet kleiner als face-smile, und das sind alles Zeiten die kleiner sind als der 29.03 face-smile.

Wenn du alle Daten eines bestimmten Tages haben willst egal welche Uhrzeit dann so
$data |  ?{$_.Date.Date -eq (get-date '29.03.2019')}  

Einfach mal mit Powershell und dessen DateTime-Objekt beschäftigen face-wink.
Member: tg6300
tg6300 May 22, 2020 at 07:48:46 (UTC)
Goto Top
Klasse, funktioniert bestens! Vielen Dank.

Ja, das werde ich machen.
Mitglied: 144260
144260 May 22, 2020 at 08:46:08 (UTC)
Goto Top
Na also, dann bitte auch den Beitrag schließen.