Redis - анализирует поток данных, предоставленный удаленным сервером

Я настроил локально Redis и хочу подключиться к удаленному серверу, который предоставляет поток синтетических данных в форме . До сих пор мне удалось подключиться к серверу, упомянутому выше, используя сокеты, прочитать поток данных и просто распечатать его. Вместо этого я хочу сохранить пары в хэш-структуре данных (позже я собираюсь хранить больше информации о каждом идентификаторе). Проблема в том, что я не знаю, как анализировать поток данных, чтобы использовать hget и как это постоянно. На более высоком уровне я хотел бы иметь возможность передавать имя и значение из входящего потока данных в качестве аргументов hget, Забыл упомянуть, что я использую Python API. До сих пор:

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

Образец потока данных:

'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'

Я не уверен, есть ли гарантия, что все строки полностью отформатированы, но давайте это сделаем.

1 ответ

Решение

Анализ одной непустой строки в пару ключ / значение так же прост:

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

Предполагая, что ваши данные могут быть неполными (незавершенная запись) и что перевод строки отмечает конец записи, вы можете сохранить неполные записи в буфере и добавить их обратно перед синтаксическим анализом, чтобы ваша функция могла выглядеть примерно так:

 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)

Реализация do_something_with(k, v) оставлено в качестве упражнения для читателя.

Другие вопросы по тегам