0

我在初始化数据时遇到了一些麻烦,以便我可以通过它们的键调用特定值......

到目前为止,这是我的代码:

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 app=helloname,receiverId=abc-abc-123-123,partner=company] INFO kafka.consumer.topic TAG_NAME Type='Generic App' Class=UpdateCheck description=版本 1 appName="TWITTER" appAction="start"

2018-12-04 13:27:12,511 [a-1 app=helloname,receiverId=abc-abc-123-123,partner=company] INFO kafka.consumer.topic TAG_NAME Type='Generic App' Class=UpdateCheck description=版本 1 appName="TWITTER" appAction="start"

我希望能够在我的 csv 文件中解析这些数据,使其看起来像这样:

应用 | 接收者 ID | 合作伙伴 | 类型 | 班级 | 描述 | 应用名称 | 应用动作 |

你好名字 | abc-abc-123-123 | 公司| 通用应用程序 | 更新检查 | 版本1 | 推特 | 开始 |

你好名字 | abc-abc-123-123 | 公司| 通用应用程序 | 更新检查 | 版本1 | 推特 | 开始 |

4

2 回答 2

1

这是一个解决方案,但它不使用 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
于 2018-12-07T19:54:03.800 回答
0

正如 Medali 所说,您可以使用正则表达式来获取您想要的数据并将其正确分离。类似的东西;

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)

我想这回答了你的问题?

于 2018-12-07T19:22:53.947 回答