2016-07-10 12 views
2

enter image description hereExtrahierung erforderlich Variablen aus Ereignisprotokolldatei mit Python

Probe erste Reihe von Ereignisprotokolldatei, hier habe ich erfolgreich extrahiert evrything abgesehen von den letzten Paar Schlüsselwert, das ist Attribut-

{"event_type":"ActionClicked","event_timestamp":1451583172592,"arrival_timestamp":1451608731845,"event_version":"3.0", 
    "application":{"app_id":"7ffa58dab3c646cea642e961ff8a8070","cognito_identity_pool_id":"us-east-1: 
    4d9cf803-0487-44ec-be27-1e160d15df74","package_name":"com.think.vito","sdk":{"name":"aws-sdk-android","version":"2.2.2"} 
    ,"title":"Vito","version_name":"1.0.2.1","version_code":"3"},"client":{"client_id":"438b152e-5b7c-4e99-9216-831fc15b0c07", 
     "cognito_id":"us-east-1:448efb89-f382-4975-a1a1-dd8a79e1dd0c"},"device":{"locale":{"code":"en_GB","country":"GB", 
     "language":"en"},"make":"samsung","model":"GT-S5312","platform":{"name":"ANDROID","version":"4.1.2"}}, 
    "session":{"session_id":"c15b0c07-20151231-173052586","start_timestamp":1451583052586},"attributes":{"OfferID":"20186", 
    "Category":"40000","CustomerID":"304"},"metrics":{}} 

Hallo Jeder Eins, ich versuche, den Inhalt aus der Ereignisprotokolldatei zu extrahieren, wie in angehängtem Bild gezeigt. Als Voraussetzung muss ich customer ID, offer id, category holen diese sind wichtige Variable, die ich aus dieser Ereignisprotokolldatei extrahieren muss .this ist csv formatiert Datei. Ich habe versucht mit regulären Ausdruck, aber es funktioniert nicht, weil Sie beobachten können, dass das Format jeder Spalte anders ist. Wie Sie sehen, erste Reihe hat categorycustomer idoffer id und die zweite Zeile ist völlig leer in diesem Fall regulären Ausdruck wird nicht arbeiten abgesehen von diesem müssen wir berücksichtigen, dass wir alle möglichen Bedingungen betrachten müssen, haben wir 14000 sample.in Ereignisprotokolldatei ... # Jason # Parsing #Python #Pandas

+1

Ist dies eine einfache Textdatei? Beginnt und endet jede Zeile mit '{}'?Wenn dem so ist, scheint es, als ob Sie die Datei zeilenweise lesen können und 'literal_eval' verwenden, um jede Zeile in ein Python-Objekt zu verwandeln. – DeepSpace

+1

Können Sie das tatsächliche Stück Ihres Datenprotokolls anstelle des Bildformats angeben? Sie erwarten nicht, dass wir Ihre Daten eins nach dem anderen eingeben, oder? – MaThMaX

+0

ja, es war im txt-Format earlier.it war riesig Datei i unter Variable aus event_type Ereignisprotokolldatei extrahiert event_timestamp arrival_timestamp event_version Anwendung { app_id cognito_identity_pool_id } Client {} {} Gerät Sitzung {} Attribute {} –

Antwort

1

Dies ist nicht der effizienteste Weg sein könnte verschachtelten json Datensätze in einer Textdatei (begrenzt durch die Linie) zu konvertieren, um Dataframe-Objekt, aber es irgendwie macht die Arbeit.

import pandas as pd 
import json 
from pandas.io.json import json_normalize 

with open('path_to_your_text_file.txt', 'rb') as f: 
    data = f.readlines() 

data = map(lambda x: eval(json_normalize(json.loads(x.rstrip())).to_json(orient="records")[1:-1]), data) 
e = pd.DataFrame(data) 
print e.head() 
2

bearbeiten

Die Daten, die nach dem bearbeiten, erscheint nun JSON-Daten zu sein. Sie können literal_eval noch wie unten verwenden, oder Sie können das json Modul verwenden:

import json 

with open('event.log') as events: 
    for line in events: 
     event = json.loads(line) 
     # process event dictionary 

die CustomerID, OfferID zuzugreifen, Category usw. müssen Sie das verschachtelte Wörterbuch mit dem Schlüssel 'attributes' im event Wörterbuch zugeordnet zuzugreifen:

print(event['attributes']['CustomerID']) 
print(event['attributes']['OfferID']) 
print(event['attributes']['Category']) 

Wenn es der Fall, dass einige Tasten Verwendung fehlen könnte dict.get() statt:

print(event['attributes'].get('CustomerID')) 
print(event['attributes'].get('OfferID')) 
print(event['attributes'].get('Category')) 

Jetzt erhalten Sie None, wenn der Schlüssel fehlt.

Sie können dieses Prinzip erweitern, um auf andere Elemente mit dem Wörterbuch zuzugreifen.

Wenn ich Ihre Frage verstehe, möchten Sie auch eine CSV-Datei erstellen, die die extrahierten Felder enthält. Sie verwenden die extrahierten Werte mit csv.DictWriter wie folgt aus:

import csv 

with open('event.log') as events, open('output.csv', 'w') as csv_file: 
    fields = ['CustomerID', 'OfferID', 'Category'] 
    writer = csv.DictWriter(csv_file, fields) 
    writer.writeheader() 
    for line in events: 
     event = json.loads(line) 
     writer.writerow(event['attributes']) 

DictWriter einfach Felder leer lassen, wenn die Dictionary-Schlüssel fehlt.


Ursprüngliche Antwort Die Daten werden nicht im CSV-Format ist, erscheint es Python-Wörterbuch Strings enthalten. Diese können in Python Wörterbücher analysiert werden unter Verwendung von ast.literal_eval():

from ast import literal_eval 

with open('event.log') as events: 
    for line in events: 
     event = literal_eval(line) 
     # process event dictionary 
+0

Wir benötigen, um die Werte der Kunden-ID und Angebot ID und Kategorie und auch in einigen Zeilen "{}" ohne Schlüssel: Wert-Paar in ihm Sir, das Ergebnis war >>> Ereignis {u'MenuItem ': u 'Kategorie', u'CustomerID ': u'364'} @mhawke –

+0

@NabiShaikh: Sobald Sie das Wörterbuch haben, können Sie auf die Attribute zugreifen. Wenn Sie Ihr aktuelles Datenmuster betrachten (das nun JSON-Daten zu sein scheint), haben Sie tatsächlich Wörterbücher verschachtelt, so dass Sie beispielsweise auf die Kunden-ID mit 'event ['attributes'] ['CustomerID']' zugreifen würden. – mhawke

+0

, Die EVENT LOG-Datei ist im TXT-Format, es ist kein Jason-Format, ich habe einen Fehler Traceback (letzter Anruf zuletzt): Datei "", Zeile 7, in Datei "C: \ Anaconda2 \ lib \ csv .py ", Zeile 152, in Writerow zurückgeben self.writer.writerow (self._dict_to_list (rowdict)) Datei" C: \ Anaconda2 \ lib \ csv.py ", Zeile 148, in _dict_to_list +", ". Join ([repr (x) für x in wrong_fields])) ValueError: dict enthält Felder nicht in Feldnamen: u'Lat ', u'Long' –

Verwandte Themen