解析反斜杠分隔的层次结构路径(不同级别数)

2024-09-30 16:20:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我有不同级别数的层次结构路径(最多4个):

FACILITIES \ PARK
ROADS \ GRASS/TURF BLVD MAINTENANCE
ROADS \ SIDEWALKS \ REPLACEMENT
FACILITIES \ PARKING - MAIN ST
RECREATION \ BANDSHELL \ PROPERTY \ BUILDING-GENERAL
FACILITIES \ FIREHALL \ PLUMBING
FACILITIES

我想解析_\_分隔符处的级别,并将值插入Maximo数据库列:

  • 悲哀1
  • 悲哀2
  • 悲哀3
  • 悲哀4

(这些列的长度现在只有10个。稍后我将创建长度更长的适当自定义列。)


我所尝试的:

我已经知道了如何解析级别并将值插入到列中-如果(这是一个很大的如果)始终有4个级别:

#Auto-script on WORKORDER
h = mbo.getString("HIERARCHYPATH")
mbo.setValue("WOEQ1", (h.split(' \\ '))[0][:10])
mbo.setValue("WOEQ2", (h.split(' \\ '))[1][:10])
mbo.setValue("WOEQ3", (h.split(' \\ '))[2][:10])
mbo.setValue("WOEQ4", (h.split(' \\ '))[3][:10])

但当然,我不会总是有4个级别。我可以在1-4之间设置任意数量的级别


如何解析以反斜杠分隔的层次结构路径(具有不同的级别数)


Tags: 路径park层次结构maintenance级别splitgrassreplacement
2条回答

这是我最后使用的脚本(它是@ti7答案的变体)

在新的层次路径少于四个级别的情况下,脚本会将现有值置零

parts = s.split(r' \ ')
for i, part in enumerate(parts, 1):
    mbo.setValue(col_prefix + str(i), part)
for i in range(len(parts)+1, 5):
    mbo.setValueNull(col_prefix + str(i))

您可以让“普通”拆分来分割行

>>> s = """\
... FACILITIES \ PARK
... ROADS \ GRASS/TURF BLVD MAINTENANCE
... ROADS \ SIDEWALKS \ REPLACEMENT
... FACILITIES \ PARKING - MAIN ST
... RECREATION \ BANDSHELL \ PROPERTY \ BUILDING-GENERAL
... FACILITIES \ FIREHALL \ PLUMBING
... FACILITIES
... """
>>> for row in s.splitlines():
...    print(row.split(" \\ "))
...
['FACILITIES', 'PARK']
['ROADS', 'GRASS/TURF BLVD MAINTENANCE']
['ROADS', 'SIDEWALKS', 'REPLACEMENT']
['FACILITIES', 'PARKING - MAIN ST']
['RECREATION', 'BANDSHELL', 'PROPERTY', 'BUILDING-GENERAL']
['FACILITIES', 'FIREHALL', 'PLUMBING']
['FACILITIES']

然后您可以迭代返回的列表,设置每个值

max_col_length = 10  # to be updated by author
for row in s.splitlines():
    for index, atom in enumerate(row.split(" \\ "), 1):  # count from 1
        mbo = "create a new row"  # not shown by author
        mbo.setValue("WOEQ{}".format(index), atom[:max_col_length])
    "INSERT row if processing rows individually"
"INSERT all rows if able to upload them all at the same time"

如果需要始终在列表中提供至少4个(或N个)成员,则可以使用itertools.repeat来填充剩余的值

>>> import itertools
>>> mylist = ['RECREATION', 'BANDSHELL', 'PROPERTY']
>>> mylist.extend(list(itertools.repeat(None, 4 - len(mylist))))
>>> print(mylist)
['RECREATION', 'BANDSHELL', 'PROPERTY', None]

相关问题 更多 >