2014-01-30 111 views
0

我已經編寫了一個程序來解析日誌文件。有問題的文件大約有一百萬條左右,我的意圖是按日期刪除所有重複的條目。所以如果某個日期有100個獨特的登錄,它將只顯示每個名稱的一個登錄。我創建的日誌輸出形式如下:刪除日誌文件中的重複條目C++

AA 01/Jan/2013 

AA 01/Jan 2013 

BB 01/Jan 2013 

等等等都是在1月份。


這是我到目前爲止已經寫的,我不斷在for循環條目通過排序量和namearr & datearr是用於名稱和日期排列。我的最終遊戲是在第一個字段中沒有與每個日期對應的重複值。我試圖遵循適當的禮儀和禮儀,所以如果我不接受這個問題的基礎,我很抱歉。

我自己解決這個問題的第一個想法是嵌套一個for循環來比較所有以前的名字與日期,但由於我正在學習數據結構和算法分析,所以我不想爬上高速運行倍。

if(inFile.is_open()) 
{ 
for(int a=0;a<i;a++) 
{  

    inFile>>name;//Take input file name 
    namearr[a]=name;//Store file name into array 
    //If names are duplicates, erase them 
    if(namearr[a]==temp) 
    { 
     inFile.ignore(1000,'\n');//If duplicate, skip to next line 
    } 
    else 
    {   
    temp=name; 
    inFile.ignore(1,' '); 
    inFile>>date;//Store date 
    datearr[a]=date;//Put date into array 
    inFile.ignore(1000,'\n');//Skip to next like 
    cout<<namearr[a]<<" "<<datearr[a]<<endl;//Output code to window 
    oFile<<namearr[a]<<" "<<datearr[a]<<endl;//Output code to file 
    }   
} 
} 

回答

0

您可以構建一個名稱,並用簡單的字符串連接的日期組成的關鍵。該字符串成爲地圖的索引。當您逐行處理文件時,請檢查該字符串是否已經存在於地圖中。如果是,那麼你在那天之前曾經遇到過這個名字。如果你已經看到它已經做了一件事,如果它是新的做另一件事。

這樣做很有效,因爲您構建的字符串只有在該日期已經看到名稱時纔會再次找到,並且可以高效地映射搜索鍵的空間以查找映射中是否存在鍵或不。

+0

我會給這個鏡頭,謝謝你的建議。 –