mycroftone
Goto Top

Zu einem vorgegebenen Datum das vorhergehende Istdatum aus einer Logdatei ermitteln

Hallo Ich höffe hier auf Hilfe im folgende Sachverhalt

Ich habe eine /mehrere Dateien mit Einträgen von verschiedene Tagen. Also eine Rechner kann mehrere MAC Adresse im Lauf der Zeit haben.

z.B.
File1
Rechner1  |  00-17-A4-F6-C0-3F    |   09.10.2008  |  
Rechner1  |  00-17-A4-F6-C0-2F    |   28.04.2010  |  
Rechner1  |  00-14-38-51-03-11    |   12.10.2009  |  
Rechner1  |  00-15-39-52-04-12    |   03.12.2009  |

oder

File2
Rechner2  |  00-16-A3-F6-C0-3F    |   09.10.2008  |  
Rechner2  |  00-26-B3-F6-C0-5F    |   28.04.2009  |  
Rechner2  |  00-14-48-51-04-11    |   12.10.2009  |  
Wobei sich die Anzahl der Zeile andert und die eingetragen Tag / (Datums) variieren

Und jetzt möchte ich per Batch herausfinden welcher Eintrag an einen andere vorgebene Datum zu dem Zeitpunkt am nächsten kommt.


Also wenn ich z.b. für File 1 das Datum 17.11.2009 angebe dann möchte ich das er mir sagt das der nächst älter Eintrag der 12.10.2009 ist.

Rechner1 | 00-14-38-51-03-11 | 12.10.2009 |

der Eintrag 03.12.2009 ist zwar der nähre aber das ist ja von einem neuer Rechner und bis dahin hatte der Rechner die MAC Adresse 00-17-A4-F6-C0-2F
also ist auch am 17.11.2009 die Netzwerkkarte mit der MAC Adresse 00-17-A4-F6-C0-2F im Rechner da die ja am 12.10.2009 in den Rechner kam.

Somit ist für das Datum 17.11.2009 und File 1 das richtige Ergebniss -> Rechner1 | 00-14-38-51-03-11 | 12.10.2009 |


Bei zwei Einträgen habe ich versucht die Einträge Jahr Monat und Tag herauszuziehen in Variblen zu schreiben und die mit Größer/Kleine Gleich zu Vergleichen.

Aber ich habe festgestellt es gibt Dateien mit mehr als zwei Einträgen.
Und spätestens da bin ich am ende meiner Weißheit.

Ich denke mir die Datei in einer Schleifen durchgehen und dann das Datum mit jeden Einzelen vergleichen.


Aber leider weiß ich nicht genau wie ich das in Batch technisch umsetzten soll.
Ich hoffe auf eure Unterstützung.

mycroftone
Kommentar vom Moderator Biber am 20.01.2011 um 08:20:35 Uhr
Original-Titel "Näheste Datum nächst älteres Datum heraussuchen" geändert.

Content-ID: 159007

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

Ausgedruckt am: 23.11.2024 um 01:11 Uhr

Biber
Biber 19.01.2011 um 18:54:45 Uhr
Goto Top
Moin mycroftone,

Zitat von @mycroftone:
Was noch besser währ währe der nächste älter
...
... weil am 12.10.2009 kamm ein neuer Rechner und bis dahin ..

Bei zwei Einträgen habe ich versucht die Einträge Jahr Monat und Tag herauszuziehen in Variblen zu schreiben
und die mit Größer/Kleine Gleich zu Vergleichen.
...
Und spätestens da bin ich am ende meiner Weißheit.

Ich bitte dich allerinständigst, doch in deinem Beitrag - bei dem es sicherlich ganz schnell gehen musste weil der Hund raus wollte und der Bäcker gleich zumacht etc -

back-to-top... die Anforderungsformulierung zu überarbeiten.


Im Groben verstehe ich die Zielrichtung (glaube ich) - aber ich hätte doch nach zwei Zeilen schon laut gerufen :
"Haben wir dafür nicht früher mal ein Multiplan oder Lotus 1-2-3 oder Excel 95 eingekauft und liegt das nicht noch in der Garage?"

WTF muss denn die "Ermittlung des nächsthöheren Folgedatums" mit Batch erfolgen -
... oder soll das irgendwo an den Rand eines bestehenden Prozesses geflanscht werden?

Grüße
Biber
mycroftone
mycroftone 19.01.2011 um 19:39:59 Uhr
Goto Top
Hallo Biber

Ja du hast völlig recht wenn du sagst diese Anforderung ( frage nach Hilfe ) kann man besser mit einer Tabellenkalkulation lösen.
Aber wie du auch schon vermutet hast ist das nur ein Teilprozess.


Ich habe eine Riese Tabelle / ein riesige Logfile das auch die MAC Adressen von 50 Rechner der Letzen 4 Jahre beinhaltet.

Und die MAC Adresse der Rechner brauche ich jetzt in einer anderen Datei.

Deswegen habe ich eine Batch Datei geschreiben in der ich mit findstr den Rechner Name herausfilter und dann aus der Zeile die MAC Adresse. Dabei habe ich festgestellt das es Rechner gibt die Unterschiedlich MAC Adressen haben. Also der Rechner irgendenwann getauscht wurde nur der Rechnername blieb.

Und in der neuen Tabelle gibt es auch ein Datum.

Also habe ich jetzt mit Findstr neune Dateien angelegt für einen Rechner dann habe festgestellt das es manchmal 2 Zeile gibt. ( In der also der Rechnername blieb aber die MAC Adresse sich geändert hat ) Jetzt habe ich so ungefahr 200 Zeilen Code geschrieben um herauszufinden welche MAC Adresse zu dem Datum die richtge ist. War schon ganz Stolz das das funktioniert.

Aber beim weiter durchprüfen der Batchdatei habe ich festgestellt das es auch Rechnerdateien mit 3 oder 4 Einträgen gibt also der Rechnername drei oder 4 physisch ander Rechner hatte oder ander Netzwerkkarten.

Da ist mir eingefall das die Leute aus diesem Forum für Lösung bei dennen ich z.b 50 -60 Zeile Cod braucht einen 2-3 Zeiler daherbrachten.

Also es ist nur eine Frage ob hier jemand in Batch oder auch in gekapselten VBS script
zu dem Datum aus der LogDatei den Eintrag mit dem nächstälteren Dateum zu finden.


Also ich hoffe die Anforderung/ Bitte für Hilfe dieses Sachverhalt und das Umfeld sind ist jetzt klarer geworden.

mycroftone
bastla
bastla 19.01.2011 um 21:17:26 Uhr
Goto Top
Hallo mycroftone!

Unter der Annahme, dass
Also wenn ich z.b. für File 1 das Datum 09.12.2009 angebe dann möchte ich das er mir sagt das der näheste Eintrag der 12.10.2209 ist.
nicht wirklich so gemeint war, sondern das Datum 03.12.2009 richtig und somit 12.10.2009 das eigentlich gesuchte vorhergehende Datum ist, könnte das wie folgt gehen:

Wenn Du für das Format
Rechner1  |  00-17-A4-F6-C0-3F    |   09.10.2008  | 
ohnehin selbst verantwortlich bist, dann modifiziere den Batch so, dass in der Datei
20081009 00-17-A4-F6-C0-3F Rechner1
steht - die Umwandlung des Datums ginge dazu etwa so:
set "DatumNeu=%Datum:~-4%%Datum:~-7,2%%Datum:~-10,2%"
- und das Ganze reduziert sich danach tatsächlich auf relativ wenige (und nur oberflächlich getestete) Zeilen (ich verteile nur der Übersicht wegen auf ein paar mehr davon):
@echo off & setlocal
set "Datei=D:\File1.txt"  
set "Stichtag=20091209"  

set "VorLetzter="  
set "Letzter="  
for /f "delims=" %%i in ('sort "%Datei%"') do if "%%i" lss "%Stichtag%" (  
    set "VorLetzter=!Letzter!"  
    set "Letzter=%%i"  
)

if defined VorLetzter echo Vorhergehende Daten: %VorLetzter%
if defined Letzter (
    echo Letzte Daten:        %Letzter%
) else (
echo Keine vor dem %Stichtag% liegenden Daten gefunden!
)
Wenn das Ergebnis Deinen Intentionen entspricht, sollten die Übergabe des Stichtages per Aufrufparameter bzw Formatierung der Ausgabe dann ja nicht mehr unter "Hexerei" fallen ...

Grüße
bastla
pieh-ejdsch
pieh-ejdsch 19.01.2011 um 22:07:43 Uhr
Goto Top
Moin mycroftone,
dann möchte ich das er mir sagt das der näheste Eintrag der 12.10.2209 ist.
ist aber noch ne laaange Zeit bis dahin!

wenn diese Dateien Log-Files sind wird doch immer unten dran geschrieben, dass heisst der letzte Eintrag eines Rechner1 ist der Aktuellste Eintrag des Rechner1

demnach wäre nur eine Zeile Code nötig

for %h in (20091209) do (@for /f "useback tokens=1-5 delims=|." %i in ("Logfile.txt") do @if %h leq %m%l%k (@set "LE-%i-A=%m/%l/%k - %j") else @if not defined LE-%i-B @set "LE-%i-B=%m/%l/%k - %j")&set LE-|Sort>NeuesLog.txt  

wenn nichts im "neuesLog.txt" ankommt dann sehn wir weiter

Ps. Deine Schreibstil ist - naja...

[Edit]ich sollte mir abgewöhnen zwischendurch andere Sachen zu machen...[/Edit]

Gruß Phil
mycroftone
mycroftone 19.01.2011 um 23:05:02 Uhr
Goto Top
Hallo Bastla

Danke für das Feedback mit dem Lösungsvorschlag.

Du und Biber hatten recht mein Text oben im ersten Beitrag war wirklich etwas Fehlerhaft bezüglich der verwendeten Datumsamgaben.
Aber jetzt habe ich er korriegiert.
Nur die Annahe das der Suchbegriff der 3.12.2009 Richtige ist stimmt nicht ich habe extra ein Datum gewählt das nicht auch in der Datei vorhanden ist sonder ein X-Beliebiges.
Aber der 12.10.2009 ist dann wie du richtig sagtest das gewünschte Ergebnis.

Also werde ich die Ausgabe nach File1 aus meiner eigentlichen Batchdatei
In einer kleine For /K Schleife Zeile für Zeile File1 mit
set "DatumNeu=%Datum:~-4%%Datum:~-7,2%%Datum:~-10,2%"  

Umwandeln und nach z.B. D:\File1-1.txt speichern

Dann deine Batchschnippsel als Unterroutine

@echo off & setlocal
set "Datei=D:\File1-1.txt"  
set "Stichtag=20091209"  

set "VorLetzter="  
set "Letzter="  
for /f "delims=" %%i in ('sort "%Datei%"') do if "%%i" lss "%Stichtag%" (  
    set "VorLetzter=!Letzter!"  
    set "Letzter=%%i"  
)

if defined VorLetzter echo Vorhergehende Daten: %VorLetzter%
if defined Letzter (
    echo Letzte Daten:        %Letzter%
) else (
echo Keine vor dem %Stichtag% liegenden Daten gefunden!
)

Dann bekomme ich in meine Batchdatei der Wert %Stichtag% zurück

Und kann dann mit findstr "%Stichtag%" "file1" meine richtige MAC Adresse für den richtigen Zeitraum herausfiltern.


Vielen dank schon im vorraus.

Ich werde es so bald wie möglich live austest.

mycroft
mycroftone
mycroftone 19.01.2011 um 23:09:40 Uhr
Goto Top
Hallo pieh-ejdsch

Nein davon das der unterste Eintrag auch der vom neuesten Datum ist kann ich leider nicht ausgehen.
Nur das in der Datei festgehalten Datum ist der alleinige Anhalt wie neu die Zeile ist.

mycroftone
mycroftone
mycroftone 19.01.2011 um 23:16:51 Uhr
Goto Top
Hallo Biber

Du hattest recht ich habe den Beitrag recht kurz vor Feierabend geschreiben. Und jetzt erst in einem Ruhigen Moment zu Hause habe gesehen das ich falsche Werte für Datumsangaben verwendet habe. Anhand dere man schlecht die Aufgabenstellung erraten konnte.

Aber Bastel hat mir einen Lösungsweg angezeigt denn ich sobald ich wieder in der Arbeit bin ausprobieren werde.

( Also übermorgen Morgen hat mein Sohn seinen 2ten Geburtstag )
bastla
bastla 19.01.2011 um 23:58:49 Uhr
Goto Top
Hallo mycroftone!
Nur die Annahe das der Suchbegriff der 3.12.2009 Richtige ist stimmt nicht ich habe extra ein Datum gewählt das nicht auch in der Datei vorhanden ist sonder ein X-Beliebiges.
Das war mir klar - nur war zunächst nach dem ersten davor liegenden Datum, und dann nach dem vorletzten gefragt - und das waren nun mal, ausgehend vom ursprünglichen 9.12., der 3.12. bzw 12.10.
Wenn Dir jetzt das jeweils letzte Datum vor dem Stichtag genügt, verkürzt sich der Batch sogar nochmals:
@echo off & setlocal
set "Datei=D:\File1.txt"  
set "Stichtag=20091117"  

set "Letzter="  
for /f "delims=" %%i in ('sort "%Datei%"') do if "%%i" lss "%Stichtag%" set "Letzter=%%i"  

if defined Letzter (
    echo Letzte Daten: %Letzter%
) else (
    echo Keine vor dem %Stichtag% liegenden Daten gefunden!
)
Dann bekomme ich in meine Batchdatei der Wert %Stichtag% zurück

Und kann dann mit findstr "%Stichtag%" "file1" meine richtige MAC Adresse für den richtigen Zeitraum herausfiltern.
Sollte ja gar nicht mehr nötig sein, wenn Du die "file1.txt" meinem Vorschlag entsprechend erstellst, da ja dann ohnehin die gesamte Zeile, also zB
20091012 00-14-38-51-03-11 Rechner1
in der Variablen %Letzter% steht und somit die MAC-Adresse zB mit
for /f "tokens=2" %%i in ("%Letzter%") do set "MAC=%%i"
(als Ersatz der oder ergänzend zur Zeile 9) ermittelt werden kann ...

Grüße
bastla
bastla
bastla 20.01.2011 um 00:04:31 Uhr
Goto Top
@ph
... und ich hatte mir (auch als edukative Maßnahme) das Verabeiten der original formatierten Datei verkniffen ... face-wink

Grüße
bastla
mycroftone
mycroftone 20.01.2011 um 00:14:06 Uhr
Goto Top
Hallo Bastel

Das ist das was ich meinte ich hatte jetzt umständlich für meinen 4 Zeilen irgendwie noch eine Schleife um meine 200 Zeile für das entscheiden für dien eine oder die andere Zeile gebastelt . Das hätte nochmal länger gedauert. Und je länger desto Fehleranfälliger.

Und meine ist ja im Kerne doch wieder nur ein Einzeiler. Also erstmal danke.
Biber
Biber 29.01.2011 um 15:11:18 Uhr
Goto Top
Sach ma, mycroftone,

hat sich denn dein Sohn inzwischen von der wilden Party erholt, ist der Senf schon von der Decke gekratzt und neue Lampenschirme gekauft worden?

Und hast du jetzt wieder Luft für ein endgültiges Abhaken oder ein weiteres Vorantreiben dieses Beitrags?

Grüße
Biber
mycroftone
mycroftone 29.01.2011 um 16:41:55 Uhr
Goto Top
Hallo Biber

Habe ich total vergessen. Sorry. Viel Luft für anderes hatte ich die Woche nicht.

Danke Bastel

Habe deine Zeilen wunderbar bei mir einbauen können.
Nur wenn das Datum niedriger ist als der Letze Eintrag der Liste dann habe ich noch ein paar Zeilen hinzugefügt
das er dann denn letzen nehmen soll.
Aber wie gesagt hier gibt es einfach ein paar Leute die ein Problem für das ich 200 Zeilen brauche
das ganze manchmal echt in ein / zwei Zeilen umsetzen können.

Also nochmal besten Dank die Problemstellung kann als gelöst betrachtet werden.

mycroftone