我有这样一种形式的数据,类别和值位于由";"分隔的同一行中,如下所示:
{{category1;value}, {category2;value}, {category3;value} ....}}
在每一行上,数据可能具有不同数量的类别。因此,第一行可能有类别 1 到类别 5,而第二行可能有类别 1 到类别 10。不过,类别总是按顺序排列。
我需要解析数据并创建一个新文件,以便在列标题中包含类别的名称,并在相应的行中具有值。
category1 category2 category3 category4 ....
value value value value
但是由于我不能说可能有多少个类别,我需要添加每个新列。因此,解析第一行,我知道有 5 列(cat1 到 cat5),但对于第二行,我必须将 cat6 的列添加到 cat10 等等。
任何知道如何做到这一点。任何 Linux bash 脚本都可以,但 python 对我来说更可取。
鉴于注释,听起来category
可以包含分号以外的任何字符,value
可以包含右大括号以外的任何字符,因为这些字符会过早终止category
或value
。
在这种情况下,可以使用正则表达式来匹配模式。
import re
def report(text):
# Remove surrounding whitespace and braces
text = text.strip()[1:-1]
pairs = re.findall(
r'''{ # literal open brace
(.+?) # one-or-more characters, stop at the first
; # literal semicolon
(.+?) # one-or-more characters, stop at the first
} # literal closed brace
''', text, re.VERBOSE)
categories, values = zip(*pairs)
widths = [max(map(len, item)) for item in pairs]
fmt = '{x:^{w}}'
for row in (categories, values):
print(' '.join([fmt.format(x = x, w = w) for x, w in zip(row, widths)]))
tests = """
{{category1;value}, {category2;value}}
{{category1;value}, {category2;value}, {category3;value}}
{{categ{,ory1;val;ue}, {category2;val{ue}, {category3;value}}
""".splitlines()
for test in tests:
report(test)
收益 率
category1 category2
value value
category1 category2 category3
value value value
categ{,ory1 category2 category3
val;ue val{ue value
可能有很多方法可以做到这一点,但可能的方法是
>>> rows = data.translate(None,"{}").replace(";",",").split(",")
>>> rows[::2]
['category1', ' category2', ' category3']
>>> rows[1::2]
['value', 'value', 'value']
和上面的一个小变化
>>> rows = dict(e.split(';') for e in data.translate(None,"{}").split(","))
>>> rows.keys()
['category1', ' category2', ' category3']
>>> rows.values()
['value', 'value', 'value']
以及使用正则表达式的另一种变体
>>> rows = re.split("[{},; ]+",data)[1:-1]
>>> rows[::2]
['category1', 'category2', 'category3']
>>> rows[1::2]
['value', 'value', 'value']