-1

カテゴリと値が「;」で区切られた同じ行にある形式のデータがあります。次のように:

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

各行のデータは、異なる数のカテゴリが存在する可能性があるようなものです。したがって、最初の行にはカテゴリ 1 からカテゴリ 5 が含まれ、2 番目の行にはカテゴリ 1 からカテゴリ 10 が含まれる場合があります。ただし、カテゴリは常に順番に表示されます。

データを解析して新しいファイルを作成し、列ヘッダーにカテゴリの名前を、対応する行に値を含める必要があります。

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

しかし、カテゴリがいくつあるかはわからないので、新しい列を追加するたびに追加する必要があります。したがって、最初の行を解析すると、5 つの列 (cat1 から cat5) があることがわかりますが、2 行目では、cat6 から cat10 の列を追加する必要があります。

これを行う方法はありますか。どの Linux bash スクリプトでもかまいませんが、私には python の方が望ましいでしょう。

4

2 に答える 2

1

コメントを考えると、 にcategoryはセミコロン以外の任意の文字を含めることができ、 a には右中括弧以外の任意の文字を含めることができるように思えます。これらの文字はorをすぐにvalue終了させるためです。categoryvalue

その場合、正規表現を使用してパターンを照合できます。

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 に答える