2016-08-15 1 views
1

Ich versuche, eine CSV-Datei für Zeilen mit doppelten Gerätenamen zu suchen. Die Ausgabe sollte das Datum von der ersten übereinstimmenden Zeile aufzeichnen und auch das Datum von der letzten gefundenen Zeile aufzeichnen. Ich brauche etwas Hilfe bei der Logik, doppelte Gerätenamen aus der CSV-Datei zu entfernen, während ich gleichzeitig eine Aufzeichnung darüber mache, wann ein Gerät zuerst und zuletzt gesehen wurde.Suche CSV für übereinstimmende Feld und verwenden Anfangsdatum

import time as epoch 

# AlertTime, DeviceName, Status 
Input = [['14/08/2016 13:00', 'device-A', 'UP'], ['14/08/2016 13:15', 'device-B', 'DOWN'], ['15/08/2016 17:30', 'device-A', 'UP']] 

# FirstSeen, LastSeen, DeviceName, Status 
Output = [] 

# Last 48 hours 
now = epoch.time() 
cutoff = now - (172800) 

for i in Input: 
    AlertTime = epoch.mktime(epoch.strptime(i[0], '%d/%m/%Y %H:%M')) 
    if AlertTime > cutoff: 
     Result = [i[0], i[0], i[1], i[2]] 
     Output.append(Result) 

print(Output) 

Ausgang (3 Einträge):

[['14/08/2016 13:00', '14/08/2016 13:00', 'device-A', 'UP'], ['14/08/2016 13:15', '14/08/2016 13:15', 'device-B', 'DOWN'], ['15/08/2016 17:30', '15/08/2016 17:30', 'device-A', 'UP']] 

gewünschte Ausgabe (2 Einträge):

[['14/08/2016 13:15', '14/08/2016 13:15', 'device-B', 'DOWN'], ['14/08/2016 13:00', '15/08/2016 17:30', 'device-A', 'UP']] 
+1

Verwenden Wörterbuch mit 'device' als Schlüssel und' (FirstSeen, LastSeen, Devicename, Status) 'als Wert. –

+0

@VedangMehta vielleicht können Sie das Feld 'DeviceName' weglassen, da es bereits der Schlüssel ist? Ansonsten stimme ich voll und ganz zu. – bdvll

+0

@bdvll Sie haben absolut Recht. –

Antwort

1

Sie können OrderedDict verwenden, um die Reihenfolge der Geräte in der CSV-Datei beizubehalten. Ein Wörterbuch wird zum automatischen Entfernen von Duplikaten verwendet.

Der folgende funktioniert, indem versucht wird, einen vorhandenen Wörterbucheintrag zu aktualisieren, wenn es nicht bereits vorhanden ist, generiert Python eine KeyError Ausnahme. In diesem Fall kann ein neuer Eintrag mit einer identischen Start- und Endealarmzeit hinzugefügt werden. Beim Aktualisieren eines Eintrags wird der vorhandene first_seen verwendet, um den Eintrag mit den zuletzt gefundenen Werten alert_time und status zu aktualisieren. Am Ende wird das Wörterbuch analysiert Ihr gewünschtes Ausgabeformat zu erstellen:

from collections import OrderedDict 

# AlertTime, DeviceName, Status 
input_data = [['14/08/2016 13:00', 'device-A', 'UP'], ['14/08/2016 13:15', 'device-B', 'DOWN'], ['15/08/2016 17:30', 'device-A', 'UP']] 

entries = OrderedDict() 

for alert_time, device_name, status in input_data: 
    try: 
     entries[device_name] = [entries[device_name][0], alert_time, status] 
    except KeyError as e: 
     entries[device_name] = [alert_time, alert_time, status] 

# Convert the dictionary of entries into the required format   
output_data = [[device_name, first_seen, last_seen, status] for device_name, [first_seen, last_seen, status] in entries.items()] 

print(output_data) 

Geben Sie eine Ausgabe wie:

[['device-A', '14/08/2016 13:00', '15/08/2016 17:30', 'UP'], ['device-B', '14/08/2016 13:15', '14/08/2016 13:15', 'DOWN']] 
+0

Danke Martin, ich schätze deine Hilfe. Ich habe deinen Ansatz benutzt. – zeepi

1

Wie Vedang Mehta in den Kommentaren gesagt, könnten Sie eine dict verwenden die zum Speichern Daten.

my_dict = {} 
    for i in Input: 
     AlertTime = epoch.mktime(epoch.strptime(i[0], '%d/%m/%Y %H:%M')) 
     if AlertTime > cutoff: 
      #if we have seen this device before, update it 
      if i[1] in my_dict: 
       my_dict[i[1]] = (my_dict[i[1]][0], i[0], i[2]) 
      #if we haven't seen it, add it 
      else: 
       my_dict[i[1]] = (i[0],i[0],i[2]) 

Danach werden alle Ihre Geräte in my_dict gespeichert werden, die (first_seen, last_seen und status).

+0

Danke bdvll für deine Mühe – zeepi

Verwandte Themen