我的父子表如下所示:
ID, ParentID, Name, Population
1, Null, Asia, 40
2, Null, Africa, 20
3, 1, China, 10
4, 3, Tibet, 5
(大约1000行,树的级别可能会有所不同。用户将继续输入新行)
我想实现一个如下所示的csv文件:
Level1, Level2, Level3, Population
Asia, Null, Null, 40
Africa, Null, Null, 20
Asia, China, Null, 10
Asia, China, Tibet, 5
如何从父子表创建这样的csv文件?第一个挑战是查找父子表的最大级别数,然后创建csv头。第二个挑战是将null设置为没有值的级别。
请注意,用户将继续输入新行...不确定我是否应该以xml格式加载父子表,然后开始阅读xml文件...请提出一些建议。谢谢
答案 0 :(得分:0)
看起来您想要从表中构造tree,然后执行树的traversal来构建csv文件。您的树节点将包含两个值:国家/地区名称和人口。
构建树时,您可能希望记下最大叶节点深度。这将为您提供csv中标题行中元素的数量。然后在遍历期间,您需要跟踪根节点的路径,这将是您在csv中打印的内容,此路径中的节点数可以从最大深度中减去,以便为您提供空值数在给定的行中。
你的Node类看起来像这样:
class Node
{
string name;
int population;
Node parent;
List<Node> children;
public Node(Node parent, string name, int population)
{
this.parent = parent;
this.name = name;
this.population = population;
children = new List<Node>();
}
public void Add(Node child)
{
children.Add(child);
}
}
答案 1 :(得分:0)
create table #Populations (ID int PRIMARY KEY, ParentId int null, Name varchar(20), Population int )
insert into #Populations values(1, null, 'Asia', 40)
insert into #Populations values(2, Null, 'Africa', 20)
insert into #Populations values(3, 1, 'China', 20)
insert into #Populations values(4, 3, 'Tibet', 10)
;with FirstLevel(ID, ParentId, Name, Population, Breadcrumb, Level, LevelStr) AS
(
select ID, ParentId, Name, Population
, convert(varchar(max),Name) as [Breadcrumb]
, Level = 1
, convert(varchar(max),'Level1')
from #Populations
where ParentId is null
union all
select p.ID, p.ParentId, p.Name, p.Population
,convert(varchar(max),[Breadcrumb] + ', ' + p.Name)
,Level + 1, convert(varchar(max)
,LevelStr + ', Level' + convert(varchar(2), Level + 1))
From #Populations p
inner join FirstLevel on FirstLevel.ID = p.ParentId
)
select top 1 LevelStr + ', Population' as CsvRow
from FirstLevel
where Level = (select max(level) from FirstLevel)
union all
select Breadcrumb + ',' + coalesce(replicate(',',(select max(level) from FirstLevel) - Level - 1), '') + ' ' + convert(varchar(20), Population)
from FirstLevel
drop table #Populations