Работа с именованными кортежами для вывода определенных данных - PullRequest
0 голосов
/ 07 декабря 2018

У меня возникли проблемы с инициализацией моих данных, чтобы я мог вызывать определенные значения по их ключам ...

Это мой код:

from kafka import KafkaConsumer
import ast
from collections import namedtuple
import json
import csv
import sys
from datetime import datetime
import os

# connect to kafka topic
kaf = KafkaConsumer('kafka.topic',
                   auto_offset_reset='earliest', bootstrap_servers=['consumer-kafka.server'])
outputfile = 'C:\\Users\\Documents\\KafkaConsum\\file.csv'

outfile = open(outputfile, mode='w', newline='')

for row in kaf:
    a = row.value.decode("utf-8")
        if "TAG_NAME" in a:
            print(a)
            outfile.write(a + '\n')

Этокак отформатированы мои данные:

2018-12-04 13: 27: 12,511 [приложение a-1 = имя_холота, идентификатор_приемника = abc-abc-123-123, партнер = компания] ИНФО кафка.consumer.topic TAG_NAME Type = 'Универсальное приложение' Class = UpdateCheck description = Version1 appName = "TWITTER" appAction = "start"

2018-12-04 13: 27: 12,511 [a-1 app = helloname,receiveId = abc-abc-123-123, partner = company] INFO kafka.consumer.topic TAG_NAME Тип = 'Универсальное приложение' Класс = UpdateCheck описание = Version1 appName = "TWITTER" appAction = "start"

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

app |receiveId |партнер |Тип |Класс |описание |appName |appAction |

helloname |abc-abc-123-123 |компания |Универсальное приложение |UpdateCheck |Версия1 |Твиттер |start |

helloname |abc-abc-123-123 |компания |Универсальное приложение |UpdateCheck |Версия1 |Твиттер |начало |

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Вот решение, но оно не использует CSV (вероятно, следует).

Он захватывает заголовок и значение в findall(..., а затем, ниже, отделяет заголовок от значения (разделяется знаком =) и записывает заголовок (только один раз) и все значения.

import re

def main():
    header = True
    fin = open('f3.txt', 'r')
    for line in fin:
        data = re.findall(r'\w+=\s*[\'"]?[\w-]+', line)
        headers = []
        array = []
        for pair in data:
            m = re.search(r'(\w+)=\s*[\'"]?([\w-]+)', pair)
            headers.append(m.group(1)) # get header
            array.append(m.group(2))   # get value

        if header == True:
            print('|'.join(headers))
            header = False
        print('|'.join(array))
    fin.close()

main()

В результате получается такой вывод:

app|receiverId|partner|Type|Class|description|appName|appAction
helloname|abc-abc-123-123|company|Generic|UpdateCheck|Version1|TWITTER|start
helloname|abc-abc-123-123|company|Generic|UpdateCheck|Version1|TWITTER|start
0 голосов
/ 07 декабря 2018

Как сказал Медали, вы можете использовать регулярное выражение, чтобы получить нужные данные и правильно их разделить.Что-то вроде:

import re

pattern = r'app=(.*?),'
app = re.search(pattern, a).group(1)

вы могли бы получить список тех заголовков, которые вам нужны, и создать цикл for для шаблона, сохранив его в словаре, а затем записать это непосредственно в csv.

вам понадобится новая переменная csv_outfile или такая, и вы измените свои открытые переменные;

headers = ['app', 'receiverid', .... , 'appAction']
outfile = open(outputfile, mode='wb')
csv_outfile = csv.DictWriter(outfile, headers, delimiter = '|')
csv_outfile.writeheader()


for header in headers:
    pattern = header + r'=(.*?),'
    my_dict[header] = re.search(pattern, a).group(1)
csv_outfile.writerow(my_dict)

Я думаю, что это отвечает на ваши вопросы?

...