2011-10-08 11 views
1

我父子表看起來像這樣:在C#中,我應該如何從父子表創建一個csv?

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標頭。第二個挑戰就是在沒有價值的層次上放置空值。

請注意,用戶將繼續進入新的生產線......不知道我是否應該加載父子表中的XML格式,然後開始讀取XML文件...請提出了一些辦法。謝謝

+0

你存儲表爲MS-SQL服務器? –

+1

而你的表存儲在關係數據庫中?幾乎給你-1沒有提到一個關於如何/在哪裏存儲數據的字。 –

+0

你想做什麼不是一個健全的數據庫實踐。 –

回答

0

它看起來像你想從你的表中構造一個tree,然後做一個traversal你的樹來構造你的csv文件。您的樹節點將包含兩個值:國家名稱和人口。

在構建樹時,您可能需要記下最大葉節點深度。這會爲您提供csv標題行中元素的數量。然後,在遍歷過程中,您需要跟蹤根節點的路徑,這將是您在csv中打印的內容,可以從您的最大深度中減去此路徑中的節點數,從而爲您提供空值在給定的行中。

您的節點類將是這個樣子:

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); 
    } 
} 
+0

如果我seriealize到XML中,它不會抱怨循環引用 – InfoLearner

+0

我不明白爲什麼你不能在內存中做到這一點。 –

+0

迄今爲止很好。我稍後會發布我的完整答案。我如何找到一旦我創建列表父母,兒童作爲公共財產最大數量的水平。檢查父項的一些邏輯是空的?我應該解析所有的節點嗎?有沒有一種巧妙的方式使用lambda表達式? – InfoLearner

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 
相關問題