2017-01-02 4 views
0

Ich habe lokal Redis eingerichtet und ich möchte eine Verbindung zu einem Remote-Server herstellen, der einen synthetischen Datenstrom in der Form < ID, Wert> bereitstellt. Ich habe es bisher geschafft, über Sockets eine Verbindung zum oben genannten Server herzustellen, den Datenstrom zu lesen und einfach auszudrucken. Stattdessen möchte ich die Paare in einer Hash-Datenstruktur speichern (ich werde später mehr Informationen über jede ID speichern). Das Problem ist, dass ich nicht weiß, wie man den Datenstrom analysiert, um hget und wie man es kontinuierlich verwendet. Auf einer höheren Ebene möchte ich Name und Wert aus dem eingehenden Datenstrom als Argumente an übergeben können. Vergessen zu erwähnen, dass ich Python API verwende. Bisher:Redis - Parse Datenstrom von Remote-Server

import socket 
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
client_socket.connect(('xx.xx.xx.xxx', 1337)) 
while 1: 
     data = client_socket.recv(512) 
     print data 

Eine Probe des Datenstroms:

'AMZN,780.6758\n' 
'TSLA,197.1802\n' 
'CSCO,29.7491\n' 
'GOOG,761.3758\n' 
'AAPL,112.4122\n' 
'GRPN,4.5848\n' 
'FB,121.1232\n' 
'MSFT,60.3529\n' 
'INTC,35.9056\n' 
'NVDA,94.473\n' 
'QCOM,68.7389\n' 
'AMZN,780.6761\n' 
'TSLA,197.1798\n' 
'CSCO,29.7486\n' 
'GOOG,761.3755\n' 
'AAPL,112.4122\n' 
'GRPN,4.5848\n' 
'FB,121.1237\n' 
'MSFT,60.353\n' 
'INTC,35.9054\n' 
'NVDA,94.473\n' 
'QCOM,68.7391\n' 

Ich bin nicht sicher, ob es eine Garantie, dass alle Linien vollständig formatiert sind, aber lasst uns, dass sie sind.

+0

Was ist los mit 'hset'? https://redis-py.readthedocs.io/en/latest/#redis.StrictRedis.hset - https://redis.io/commands/hset –

+0

@brunodesthuilliers Die Frage mag zu einfach sein, aber ich kann nicht herausfinden wie man sich bei Verwendung von 'hset' auf die ID und den Wert des Datenstroms bezieht. hset (hash1, user, 1) scheint natürlich einfach zu sein, aber wie man Daten parst, die sich ständig ändern? – lacrima

+0

Bitte editieren Sie zuerst Ihre Frage, um zu erklären, was Ihr eigentliches Problem ist - es geht natürlich nicht um das Redisting, sondern darum, wie Sie Ihre eingehenden Daten parsen. Fügen Sie dann Beispiele für Ihre eingehenden Daten hinzu _und_, wie sie nach der Analyse aussehen sollen. –

Antwort

1

eine einzige nicht-leere Zeile in einen Schlüssel/Wert-Paar Parsing ist so einfach wie:

key, value = line.strip().split(",", 1) 

Ihre Daten Unter der Annahme, unvollständig sein kann (ungekündigten Datensatz) und dass es die Zeilenendmarke, die das Ende eines markiert Satz können Sie unvollständige Datensätze in einem Puffer speichern und sie vor dem Parsen, so dass Ihre Funktion könnte wie folgt aussehen hinzufügen zurück:

def run(client_socket): 
    buffer = "" 
    while True: 
     data = client_socket.recv(512) 
     # not sure the following lines makes sense - 
     # you may actually want to handle exceptions 
     # or whatever 
     if not data: 
      break 

     # add the buffer back 
     data = buffer + data 
     # split on newlines 
     lines = data.splitlines() 
     # check if we have an incomplete record 
     # (if it doesn't end with a newline) 
     if data[-1] != '\n': 
      # incomplete record, store it back so 
      # we process it next time 
      buffer = lines.pop() 
     else: 
      # all records complete for this call, 
      # empty the buffer for next turn 
      buffer = "" 

     # now handle our records:  
     for line in filter(None, lines): 
      k, v = line.split(",", 1) 
      do_something_with(k, v) 

als Übung die Umsetzung do_something_with(k, v) bleiben den Leser.

+0

Vielen Dank! Das hilft definitiv! – lacrima

+0

Gern geschehen ;-) –

Verwandte Themen