-1

我有一种形式的数据,类别和值位于同一行,由“;”分隔 如下:

{{category1;value}, {category2;value}, {category3;value} ....}}

在每一行上,数据可能存在不同数量的类别。因此,第一行可能有 category1 到 category5,而第二行可能有 category1 到 category10。不过,类别总是按顺序排列的。

我需要解析数据并创建一个新文件,以便在列标题中包含类别的名称和相应行中的值。

category1        category2        category3       category4    ....
 value             value             value          value

但是由于我不能说可能有多少类别,所以我需要添加每个新列。因此,解析第一行我会知道有 5 列(cat1 到 cat5),但是对于第二行,我必须将 cat6 的列添加到 cat10 等等。

任何想法如何做到这一点。任何 Linux bash 脚本都可以,但 python 对我来说更可取。

4

2 回答 2

1

鉴于评论,听起来 thecategory可以包含除分号以外的任何字符,并且 avalue可以包含除右括号之外的任何字符,因为这些字符会终止categoryorvalue太快。

在这种情况下,可以使用正则表达式来匹配模式。

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  
于 2012-12-05T13:05:08.117 回答
0

可能有很多方法可以做到这一点,但一种可能的方法是

>>> 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']
于 2012-12-05T10:47:43.040 回答