在C#中,我应该如何从父子表创建csv?

时间:2011-10-08 21:39:01

标签: c#

我的父子表如下所示:

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文件...请提出一些建议。谢谢

2 个答案:

答案 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