2010-12-17 3 views
1

Скажем, у меня есть таблица, такие как:Turn уплощенного источника данных в иерархический один

D_ID C_ID B_ID A_ID 
1D  1C  1B  1A 
4D  2C  6B  1A 
6D  1C  1B  1A 
9D  1C  1B  1A 
8D  2C  6B  1A 

И давайте говорить, что структурно говоря, я знаю следующее:

A's 
B's 
    C's 
    D's 

Это D's является дети C, C's B и т. д.

Как я могу превратить таблицу вверх в иерархический источник данных? Такие, как

ID ParentID 
1D 1C 
4D 2C 
6D 1C 
9D 1C 
8D 2C 
1C 1B 
2C 6B 
1B 1A 
6B 1A 
1A Null 

Это могло бы служить в качестве источника данных иерархической для TreeView Telerik или других иерархических элементов управления? Я знаю, что могу перебирать каждый элемент и самостоятельно его строить, но мне интересно, есть ли более известные способы повторить это. Возможно, даже встроенный способ достичь этого.

ответ

2

Вы можете написать простую итерацию, проходящую через файл, и добавление пар элементов в словарь. В pythonish выглядящий код psuedo:

// open the file you want to parse. 
file = open(my_log_file) 

// create a hash map from ID to parent. 
dictionary = {} 

// read through the file line by line 
for line in file.getlines(): 
    // ignore first line ... 
    // read the 4 columns in each line 
    columns[] = line.split(" ") 

    // add pairs (id=column[i], parent=column[i+1]) to the hashmap 
    dictionary[column[1]] = column[2] 
    dictionary[column[2]] = column[3] 
    dictionary[column[3]] = column[4] 
    dictionary[column[4]] = Nil 


// output the hashmap line by line. 
print "ID", "Parent ID" 
for (id, parent) in dictionary: 
    print id, parent 

Надеюсь, это поможет.

1

Вот быстрая мысль ....

Если я понимаю правильно, вы можете просто итерацию по списку справа налево, и читать пар ... Используйте словарь/карту/Hashtable, чтобы держать их организовано. Вам может понадобиться определить для него пользовательский компаратор, но это не слишком сложно.

Так как вы итерацию по справа налево, сверху вниз, вы добавляете пары, как вы читаете их так ..

parent = "1A"; 
child = "1B"; 
list.add(child, parent); 
//Then on the next iteration..... 
parent = "1B"; 
child = "1C"; 

И так поехали ...

Таким образом, используя дочерний элемент в качестве ключа, вы остаетесь со списком всех уникальных значений, это станет вашим столбцом идентификатора.

Затем ваш list.values ​​() становится вашим столбцом ParentID, так как он будет содержать дубликаты для всех родителей, у которых было более одного ребенка. Именно поэтому ребенок отлично работает как ключ, так как вы можете родиться только один раз, но у вас может быть много детей.

EDIT: BAH! Кто-то избил меня к нему с гораздо более полной версией того, что я предлагал в любом случае ... ну ладно. Мне больше нравится мое словесное описание;)

Смежные вопросы