当前位置: 首页 > 知识库问答 >
问题:

如何通过过滤一些文本来合并几行

薛晨
2023-03-14

我有一个以下格式的文本文件。

第一行包括“USERID”=12345678,其他行包括每个应用程序的用户组:例如:

用户T-number 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模块来完成这一点吗?

共有2个答案

子车飞文
2023-03-14

我不太确定您是否应该在这里使用csv模块-它包含混合数据,可能不仅仅是用户和用户组权限?对于用户声明,您只需要检索其组和id,而对于应用程序权限,您需要提取组、应用程序名称和权限。您拥有的数据越不相同,您将遇到越多的问题—通过手动解析数据,当您满足某些标准时,您总是能够继续。

到目前为止,我必须说,最好是手动逐行解析这些行,将其构造成有意义的内容,然后输出数据。比如说

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]))

此处在线演示

景修杰
2023-03-14

我认为使用csv模块读取和解析输入文本文件没有任何好处。字段的数量各不相同:USERID行中有6个字段,其中2个为空,但其他行中有5个非空字段。字段看起来非常简单,因此不需要csv处理隐藏在引号中的分隔符等。csv文件中没有标题行,但数据行中有许多标题。

一个简单的例程可以读取每一行,在分号字符上拆分每一行,解析该行,并组合相关行。

输出文件是另一回事。行的格式相同,字段数相同。因此,创建该输出可能是csv的一个很好的用途。但是,格式非常简单,因此也可以在不使用csv的情况下创建文件。

 类似资料:
  • 问题内容: 我有一个 和 我想过滤掉那些不在赛场上的球员。 我知道如何在Java 8之前的Vanilla中执行此操作 我正在尝试使用Lambda表达式编写此简单的代码,但是我正在努力在过滤器中工作 这不会编译。 “无法解决方法getUsername()” 问题答案: 您将lambda表达式放在错误的位置-整个参数应该是lambda表达式。换句话说,“给一个玩家,我应该过滤还是不过滤?”

  • 任何一位jsoup大师都能告诉我一些将html过滤成文本/字符串的建议吗?我已尝试调用文档的text()。但所有标记/元素都将被过滤。我的目标是过滤一些指定的标记。 例如:我有HTML文本: 得到结果: 它已过滤标记。

  • 问题内容: 我正在做熊猫分析。 我的表有700万行* 30列。单元格值的范围从-1到3随机。现在,我想根据列的值过滤掉行。 我了解如何根据多个条件进行选择,写下条件并通过“&”“ |”组合。 但是我有30列要过滤,并按相同的值过滤。例如,需要选择最后12列的值等于-1 上面的代码给了我一个布尔值。我需要实际的数据框。 这里的逻辑是“或”,表示如果任何列的值为-1,则需要选择该行。另外,很高兴知道我

  • 问题内容: 我有一个像这样的数组: 现在,我想按某种条件过滤该数组,只保留值等于2的元素,并删除值不等于2的所有元素。 所以我的预期结果数组将是: 注意:我想保留原始数组中的键。 如何使用PHP做到这一点?有内置功能吗? 问题答案:

  • 问题内容: 我的数据库中有一些数据: 我要保持秩序,并合并几乎相同的用户物品,该怎么办?当我使用shell脚本时,我将(文件测试中的数据。): 这将得到结果为: 但是如何使用sql呢? 问题答案: 如果你试试: 这给出了: 因此,您可以尝试: 这使 (我打电话给我的表,也只是使用的名称和因为我懒得写,并一遍又一遍)。

  • 我试图子集一个熊猫DataFrame在python基于两个逻辑语句 即。 但是第3行的语法无效。 有没有一种方法可以在一行中完成?