2013-04-05 40 views
0

我想通過數據庫循環,找到合適的值並將它們插入到單獨文件中的相應單元格中。它可能是一個csv或其他人可讀的格式。 在僞代碼:寫表格單元格實時python

for item in huge_db: 
    for list_of_objects_to_match: 
     if itemmatch(): 
     if there_arent_three_matches_yet_in_list(): 
      matches++ 
      result=performoperationonitem() 
      write_in_file(result, row=object_to_match_id, col=matches) 
     if matches is 3: 
      remove_this_object_from_object_to_match_list() 

你能想到的不是通過行會,每次通過所有OUTPUTFILE線以外的任何方式? 我甚至不知道要搜索什麼... 甚至更​​好,有更好的方法來在數據庫中找到三個匹配的對象,並實時得到結果? (操作起來需要一段時間,但我想看到的結果凸顯RT)

+0

我可以考慮創建一組文件夾/文件而不是表格,但似乎是一個矯枉過正的... – deddu 2013-04-06 01:20:03

回答

0

假設itemmatch()是一個相當簡單的功能,這會做什麼,我想你想比你的更好的僞代碼:

for match_obj in list_of_objects_to_match: 
    db_objects = query_db_for_matches(match_obj) 
    if len(db_objects) >= 3: 
     result=performoperationonitem() 
     write_in_file(result, row=match_obj.id, col=matches) 
    else: 
     write_blank_line(row=match_obj.id) # if you want 

然後這個技巧就變成了編寫query_db_for_matches()函數。如果沒有詳細信息,我會假設您正在尋找匹配某個特定字段的對象,將其稱爲type。在pymongo這樣的查詢將如下所示:

def query_db_for_matches(match_obj): 
    return pymongo_collection.find({"type":match_obj.type}) 

爲了得到這個高效運行,確保您的數據庫有你先電話查詢的字段(一個或多個)指數:

pymongo_collection.ensure_index({"type":1}) 

您第一次撥打電話ensure_index可能需要很長時間才能完成大量收藏。但每次之後,它都會很快 - 甚至可以在find之前將它放入query_db_for_matches,這樣就沒事了。

+0

謝謝,可悲的是,我匹配的數據庫中的值的子集,匹配函數是相當事情複雜化。問題更多的是「如何實現」write_in_file(result,row = object_to_match_id,col = matches)「與循環運行獨立並且具有實時輸出。 – deddu 2013-04-06 14:32:05

+0

對不起 - 我想我不明白你在說什麼然後詢問,不確定CSV文件的「實時」輸出是什麼意思,特別是如果您要以非連續的順序修改單元格的話 – Leopd 2013-04-07 03:09:09

+0

對不起,再次感謝,請允許我重申問題:我想要生成一個表(python),並用html解析器(java)同時讀取它。生成表條目的操作非常長且複雜,因此我想要處理並可視化結果擦除和重寫一個完整的文件 我想使用「seek」並只改變文本文件中的行/單元格,或者我將不得不使用另一個數據庫... – deddu 2013-04-07 12:52:13