2012-12-05 38 views
-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比我更可取。

+0

類別或值可以包含括號? – unutbu

+0

@unutbu值可以有任何字符。但類別周圍有大括號;值對也如圖所示。 – sfactor

+0

如果'value'可以包含任何字符,那麼應該使用什麼規則來確定「{{category1; value},{category2; value}}」沒有被分析爲具有一個類別「category1」,值爲value },{category2; value'? – unutbu

回答

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'] 
1

給出評論,這聽起來像category可以包含除以外的任何字符分號和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 
相關問題