在 CSV 文件中存储的图形结构中将父子连接起来

问题描述 投票:0回答:1

我有一个像这样的 CSV 格式的文件。文件的第一行是标题。例如,根据“tree”列,并且“type”列为“asset”,“2”是“2-1”、“2-2”、“2-3”、“2-4”的父级'、'2-5' 和 '2-6'。所以,这代表了父母与孩子之间的联系。

type,value,tree
asset,804039,1
asset,4981064,2
asset,0,2-1
asset,0,2-2
asset,0,2-3
asset,0,2-4
asset,4981064,2-5
asset,0,2-6
asset,0,3
asset,0,4
asset,98020054,5
asset,91937245,5-1
asset,10388174.29,5-1-1
asset,6996784.052,5-1-2
asset,315739.2178,5-1-3
asset,1135060.556,5-1-4
asset,37892182.79,5-1-5
asset,0,5-1-6
asset,6159630.542,5-1-7
asset,10143795.1,5-1-8
asset,1373848.703,5-1-9
asset,0,5-1-10
asset,0,5-1-11
asset,17930450.26,5-1-12
asset,-398420.5111,5-1-13
asset,6082809,5-2
asset,49659.17318,5-2-1
asset,49758.30444,5-2-2
asset,0,5-2-3
asset,111980.8613,5-2-4
asset,4847409.425,5-2-5
asset,0,5-2-6
asset,237688.3054,5-2-7
asset,22624.26312,5-2-8
asset,3795.816539,5-2-9
asset,0,5-2-10
asset,0,5-2-11
asset,419330.3593,5-2-12
asset,340562.4915,5-2-13
asset,262083321,12-4
asset,18178155,13
asset,53925869,14
asset,181039,15
asset,0,16
asset,533123566,17
asset,0,18
liability,137654526.1,1
liability,31250403.75,1-1
liability,0,1-1-1
liability,0,1-1-2
liability,0,1-1-3
liability,0,1-1-4
liability,0,1-1-5
liability,31250403.75,1-1-6
liability,59157335.9,1-2
liability,41386920.9,1-2-1
liability,5065758.1,1-2-2
liability,10328578,1-2-3
liability,2376078.9,1-2-4
liability,0,1-2-5
liability,19410,1-3
liability,0,1-4
liability,46346096.4,1-5
liability,0,1-6
liability,881280,1-7
liability,707524360.5,2
liability,615062332.6,2-1
liability,85822601.76,2-2
liability,831395.04,2-3
liability,0,2-4
liability,266616,2-5
liability,5541415.04,2-6
liability,312055320.5,3
liability,4000000,3-1
liability,105938,3-2
liability,35273,3-3
liability,0,3-6
liability,0,3-4
liability,316196531.5,3-5
revenue,29052387,1
revenue,28362313,1-1
revenue,14973997,1-1-1
revenue,1265644,1-1-1-1
revenue,836579,1-1-1-2
revenue,2949,1-1-1-3
revenue,321356,1-1-1-4
revenue,8354928,1-1-1-5
revenue,0,1-1-1-6
revenue,1435863,1-1-1-7
revenue,1014168,1-1-1-8
revenue,1656223,1-1-1-9
revenue,0,1-1-1-10
revenue,0,1-1-1-11
revenue,0,1-1-1-12
revenue,86287,1-1-1-13
revenue,512171,1-1-2
revenue,512171,1-1-2-1
revenue,0,1-1-2-2
revenue,0,1-1-2-3
revenue,1750586,1-1-3
revenue,0,1-1-3-1
revenue,0,1-1-3-2
revenue,773887,1-1-3-3
revenue,0,1-1-3-4
revenue,0,1-1-3-5
revenue,34186,1-1-3-6
revenue,0,1-1-3-7
revenue,3366,1-1-3-8
revenue,285361,1-1-3-9
revenue,70382,1-1-3-10
revenue,12581,1-1-3-11
revenue,0,1-1-3-12
revenue,0,1-1-3-13
revenue,0,1-1-3-14
revenue,0,1-1-3-15
revenue,570823,1-1-3-16
revenue,11125559,1-1-4
revenue,0,1-1-5
revenue,0,1-1-6
revenue,690074,1-2
revenue,690074,1-2-1
revenue,0,1-2-1-1
revenue,0,1-2-1-2
revenue,690074,1-2-1-3
cost,123274225,1
cost,110562530,1-1
cost,109908145,1-1-1
cost,109908145,1-1-1-1
cost,0,1-1-1-2
cost,0,1-1-1-3
cost,0,1-1-1-4
cost,0,1-1-1-5
cost,0,1-1-1-6
cost,0,1-1-1-7
cost,654385,1-1-2
cost,0,1-1-2-1
cost,0,1-1-2-2
cost,0,1-1-2-3
cost,654385,1-1-2-4
cost,12711696,1-2
cost,9178729,1-2-1
cost,5620473,1-2-1-1
cost,3558256,1-2-1-2
cost,749003,1-2-2
cost,-607976,1-2-2-1
cost,1356979,1-2-2-2
cost,2209949,1-2-3
cost,0,1-2-3-1
cost,2209949,1-2-3-2
cost,574015,1-2-4
cost,473028,1-2-4-1
cost,100987,1-2-4-2
cost,0,1-2-5
cost,0,1-2-5-1
cost,0,1-2-5-2
cost,0,1-2-6

我想编写 Python 代码来生成这样的会计约束字符串元组:

('asset_2 == asset_2-1 + asset_2-2 + asset_2-3 + asset_2-4 + asset_2-5 + asset_2-6',
 'asset_5 == asset_5-1 + asset_5-2',
 'asset_5-1 == asset_5-1_1 + asset_5-1-2 + asset_5-1-3 + asset_5-1-4 + asset_5-1-5 + asset_5-1-6 + asset_5-1-7 + asset_5-1-8 + asset_5-1-9 + asset_5-1-10 + asset_5-1-11 + asset_5-1-12 + asset_5-1-13',
...,
'liability_1 == liability_1_1 + liability_1_2 + liability_1_3 + liability_1_4 + liability_1_5 + liability_1_6 + liability_1_7',
...,
'revenue_1 == revenue_1_1 + revenue_1_2',
'revenue_1_1 == revenue_1_1_1 + revenue_1_1_2 + revenue_1_1_3 + revenue_1_1_4 + revenue_1_1_5 + revenue_1_1_6',
...,
'cost_1 == cost_1_1 + cost_1_2',
'cost_1_1 == cost_1_1_1 + cost_1_1_2',
...
)

正如您在上面的输出中看到的,所有孩子现在都已连接到他们的父母。

python csv
1个回答
2
投票

您可以使用字典从复合名称中组装父/子结构(使用前缀作为层次关系):

with open('csv.txt') as f:      
    csv_lines = f.read().split("\n")

names = ["{0}_{2}".format(*line.split(",")) for line in csv_lines]

grouped = { name:[] for name in names }
grouped.update( (parent,grouped[parent]+[child])      
                for child in names for parent in child.rsplit("-",1)[:1]
                if parent != child and parent in grouped)

result = tuple( parent + " == " + " + ".join(children)
                for parent,children in grouped.items() if children )

输出:

print(*result,sep="\n")

asset_2 == asset_2-1 + asset_2-2 + asset_2-3 + asset_2-4 + asset_2-5 + asset_2-6
asset_5 == asset_5-1 + asset_5-2
asset_5-1 == asset_5-1-1 + asset_5-1-2 + asset_5-1-3 + asset_5-1-4 + asset_5-1-5 + asset_5-1-6 + asset_5-1-7 + asset_5-1-8 + asset_5-1-9 + asset_5-1-10 + asset_5-1-11 + asset_5-1-12 + asset_5-1-13
asset_5-2 == asset_5-2-1 + asset_5-2-2 + asset_5-2-3 + asset_5-2-4 + asset_5-2-5 + asset_5-2-6 + asset_5-2-7 + asset_5-2-8 + asset_5-2-9 + asset_5-2-10 + asset_5-2-11 + asset_5-2-12 + asset_5-2-13
liability_1 == liability_1-1 + liability_1-2 + liability_1-3 + liability_1-4 + liability_1-5 + liability_1-6 + liability_1-7
liability_1-1 == liability_1-1-1 + liability_1-1-2 + liability_1-1-3 + liability_1-1-4 + liability_1-1-5 + liability_1-1-6
liability_1-2 == liability_1-2-1 + liability_1-2-2 + liability_1-2-3 + liability_1-2-4 + liability_1-2-5
liability_2 == liability_2-1 + liability_2-2 + liability_2-3 + liability_2-4 + liability_2-5 + liability_2-6
liability_3 == liability_3-1 + liability_3-2 + liability_3-3 + liability_3-6 + liability_3-4 + liability_3-5
revenue_1 == revenue_1-1 + revenue_1-2
revenue_1-1 == revenue_1-1-1 + revenue_1-1-2 + revenue_1-1-3 + revenue_1-1-4 + revenue_1-1-5 + revenue_1-1-6
revenue_1-1-1 == revenue_1-1-1-1 + revenue_1-1-1-2 + revenue_1-1-1-3 + revenue_1-1-1-4 + revenue_1-1-1-5 + revenue_1-1-1-6 + revenue_1-1-1-7 + revenue_1-1-1-8 + revenue_1-1-1-9 + revenue_1-1-1-10 + revenue_1-1-1-11 + revenue_1-1-1-12 + revenue_1-1-1-13
revenue_1-1-2 == revenue_1-1-2-1 + revenue_1-1-2-2 + revenue_1-1-2-3
revenue_1-1-3 == revenue_1-1-3-1 + revenue_1-1-3-2 + revenue_1-1-3-3 + revenue_1-1-3-4 + revenue_1-1-3-5 + revenue_1-1-3-6 + revenue_1-1-3-7 + revenue_1-1-3-8 + revenue_1-1-3-9 + revenue_1-1-3-10 + revenue_1-1-3-11 + revenue_1-1-3-12 + revenue_1-1-3-13 + revenue_1-1-3-14 + revenue_1-1-3-15 + revenue_1-1-3-16
revenue_1-2 == revenue_1-2-1
revenue_1-2-1 == revenue_1-2-1-1 + revenue_1-2-1-2 + revenue_1-2-1-3
cost_1 == cost_1-1 + cost_1-2
cost_1-1 == cost_1-1-1 + cost_1-1-2
cost_1-1-1 == cost_1-1-1-1 + cost_1-1-1-2 + cost_1-1-1-3 + cost_1-1-1-4 + cost_1-1-1-5 + cost_1-1-1-6 + cost_1-1-1-7
cost_1-1-2 == cost_1-1-2-1 + cost_1-1-2-2 + cost_1-1-2-3 + cost_1-1-2-4
cost_1-2 == cost_1-2-1 + cost_1-2-2 + cost_1-2-3 + cost_1-2-4 + cost_1-2-5 + cost_1-2-6
cost_1-2-1 == cost_1-2-1-1 + cost_1-2-1-2
cost_1-2-2 == cost_1-2-2-1 + cost_1-2-2-2
cost_1-2-3 == cost_1-2-3-1 + cost_1-2-3-2
cost_1-2-4 == cost_1-2-4-1 + cost_1-2-4-2
cost_1-2-5 == cost_1-2-5-1 + cost_1-2-5-2

注意:根据你的例子,我有意排除了没有孩子的父母。通过从结果理解中删除

if children
条件,可以很容易地包含这些内容。

© www.soinside.com 2019 - 2024. All rights reserved.