我有一个文本文件,格式如下。
第一行包括“USERID”= 12345678,其他行包括每个应用程序的用户组: 例如:
具有用户T号码T12345的用户具有对APP1和APP2的WRITE访问权限以及对APP1的READ-ONLY访问权限。
T-Number只是其他一种ID。
00001,00002等是序列号,可以忽略。
T12345;;USERID;00001;12345678;
T12345;APPLICATION;WRITE;00001;APP1
T12345;APPLICATION;WRITE;00002;APP2
T12345;APPLICATION;READ-ONLY;00001;APP1
我需要进行一些过滤并将包含USERID的行与包含用户组的所有行合并,将t-number与userid匹配(T12345 = 12345678)
所以输出应该是这样的。
12345678;APPLICATION;WRITE;APP1
12345678;APPLICATION;WRITE;APP2
12345678;APPLICATION;READ-ONLY;APP1
我应该使用csv python模块来实现这个目标吗?
答案 0 :(得分:1)
我认为使用csv
模块读取和解析输入文本文件没有任何优势。字段数有所不同:USERID行中有6个字段,其中2个为空,但其他行中有5个非空字段。这些字段看起来非常简单,因此不需要csv
处理隐藏在引号等中的分隔符字符。 csv文件中没有标题行,而是在数据行中散布了许多标题。
一个简单的例程,它读取每一行,在分号字符上拆分,并解析该行,并组合相关的行就足够了。
输出文件是另一回事。这些行具有相同的格式,具有相同的字段数。因此,创建该输出可能是csv的一个很好的用途。但是,格式非常简单,也可以在没有csv
的情况下创建文件。
答案 1 :(得分:0)
我不确定你是否应该在这里使用csv
模块 - 它有混合数据,可能不仅仅是用户和用户组权限?在用户声明的情况下,您只需要检索其组和ID,而对于应用程序权限,您需要提取组,应用程序名称和权限。您拥有的数据越多,遇到的问题就越多 - 通过手动解析数据,当您遇到某些标准时,您始终只能continue
。
到目前为止,我必须说你最好通过手动逐行解析线条,将其构造成有意义的东西,然后输出数据。例如
from StringIO import StringIO
from pprint import pprint
feed = """T12345;;USERID;00001;12345678;
T12345;;USERID;00001;2345678;
T12345;;USERID;00002;345678;
T12345;;USERID;00002;45678;
T12345;APPLICATION;WRITE;00001;APP1
T12345;APPLICATION;WRITE;00002;APP2
T12345;APPLICATION;READ-ONLY;00001;APP1
T12345;APPLICATION;WRITE;00002;APP1
T12345;APPLICATION;WRITE;00002;APP2"""
buf = StringIO(feed)
groups = {}
# Read all data into a dict of dicts
for line in buf:
values = line.strip().split(";")
if values[3] not in groups:
groups[values[3]] = {"users": [], "apps": {}}
if values[2] == "USERID":
groups[values[3]]['users'].append(values[4])
continue
if values[1] == "APPLICATION":
if values[4] not in groups[values[3]]["apps"]:
groups[values[3]]["apps"][values[4]] = []
groups[values[3]]["apps"][values[4]].append(values[2])
print("Structured data with group as root")
pprint(groups)
print("Output data")
for group_id, group in groups.iteritems():
# Order by user, app
for user in group["users"]:
for app_name, rights in group["apps"].iteritems():
for right in rights:
print(";".join([user, "APPLICATION", right, app_name]))