使用命名元组输出特定数据



我在初始化数据时遇到了一些问题,这样我就可以通过它们的键调用特定的值。。。

这是我迄今为止的代码:

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:12511[a-1app=helloname,receiverId=abc-abc-123-123,partner=company]信息kafka.consumer.topic TAG_NAME Type="通用应用程序"Class=UpdateCheckdescription=Version1 appName=";TWITTER";appAction=";"开始";

2018-12-04 13:27:12511[a-1app=helloname,receiverId=abc-abc-123-123,partner=company]信息kafka.consumer.topic TAG_NAME Type="通用应用程序"Class=UpdateCheckdescription=Version1 appName=";TWITTER";appAction=";"开始";

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

app|receiverId|partner|Type|Class|description|appName|appAction|

helloname|abc-abc-123-123|公司|通用应用程序|更新检查|版本1|TWITTER|start|

helloname|abc-abc-123-123|公司|通用应用程序|更新检查|版本1|TWITTER|start|

这里有一个解决方案,但它不使用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

正如Medali所说,您可以使用正则表达式来获得所需的数据,并将其正确分离。类似于;

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

实际上,您可以有一个所需标头的列表,并通过模式进行for循环,将其保存在字典中,然后直接将其写入csv。

您将需要一个新的变量csv_offile或类似的变量,并更改您的开放变量;

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)

我想这能回答你的问题吗?

最新更新