2016-10-31 2 views
0

MS 프로젝트 파일을 CSV로 추출했습니다. 매우 큰 (40 000 줄) 나는 작업/마일스톤/종속성을 선행하는 모든 작업을 인쇄 할 수있는 Python 스크립트를 만들려고합니다.Python MS Project 선행 for 루프로 재귀

문제는 여러 선행 작업이 있습니다. 나는 이것을 '~'로 구분하여 저장했습니다.

#Starting ID 
MSid = 80329 

#Subroutine FindPredesessors(MSid) 
def FindPred(MSid): 
#Get element[id] from the array     
    print(MSid) 
    #Predecessors of task 
    preds = arrMAX[MSid][1] 
    #List of split milestones 
    spID = spad.split('~') 

    #Attempt to loop through Function for each milestone in the split list 
    for h in range(len(spID)):   
     print(spID[h]) 
     print(h) 
     FindPred(int(spID[h])) 

FindPred(MSid) 

내가 할 수있는 최선

80329 
['80326', '83171'] 
['80324', '80432'] 
['80323'] 
'' 

내가 매우 왼손 경로를 얻을 수있는 다음과 같은 출력,하지만 난의 나머지를 통해 기능을 돌아올 것 루프 수 없습니다 분할 목록

+0

분명히 몇 가지 선행 작업을 수행 할 것이므로 이미 검색 한 ID를 저장하고 각 검색을 수행하기 전에 확인하십시오. –

답변

0

Breadth First Search이 필요합니다. 아이디어는 다음과 같습니다 큐는

  • 대기열
  • current의 모든 전임자를 넣어 그것에서
    • 의 get() current ID가 비어 있지 않은 동안

      1. queue
      2. 에 필요한 이벤트 ID를 넣어

    선택된 사건의 전임자들과 그 이후의 모든 전임자들.

    #!/usr/bin/env python3 
    from queue import Queue 
    
    size = 6 
    # in assumption you have devided strings to lists of ids 
    # -1 means that event has no predecessor. 
    preds = [[-1], [-1], [-1], [0], [1, 2], [3, 4]] 
    
    def bfs(start): 
        """ Prints path of Depth first search given predecessors for all events""" 
        q = Queue() 
        q.put(start) 
    
        while not q.empty(): 
         current = q.get() 
         currentPreds = preds[current] 
         print(current, end=' ') 
         # or you can print them with predecessors 
         # print(currentId =', current, '| preds:', currentPreds) 
    
         for c in currentPreds: 
          if not visited[c] and c != -1: 
           q.put(c) 
        print() 
    
    bfs(5) 
    
    +0

    나는 지금 그것을 시도했고 비슷한 결과를 얻고있다. 나는 for 루프를 완성하는 곳으로 되돌아 오는 함수를 얻는 것처럼 보이지 않는다. – codderz

    +0

    @codderz 답변을 변경했습니다. 이제 도움이 될 수 있기를 바랍니다. 재귀 버전 만 검색하는 경우 Depth First Search를 확인하십시오. 그러나 그런 작업을 수행 할 필요는 없습니다. – gasabr

    +0

    그게 지금까지 최선을 다하고 있어요. 고맙습니다. 하지만 몇 가지 이유로 모든 공백 필드를 -1로 대체했는데 목록에 점점 앉아있어 오류로 종료됩니다 – codderz