2015-09-21 33 views
1

我想比較兩個包含事務列表的日誌文件。這些交易的字段在行本身內定義。例如:超越比較4:如何僅顯示包含特定字符串的行?

transactionID: 1, transactionType: 6, transactionData: 123456 
    transactionID: 2, transactionType: 6, transactionData: 654321 

在一個日誌文件,TRANSACTIONTYPE 6交易可能會連續,而在其他的文件,他們可以與其他交易類型交錯。所以雖然transactionID可能不同,但它們仍然會以相同的順序包含相同的數據。

我怎樣才能過濾或以其他方式只列出了其中包含字符串「TRANSACTIONTYPE:6」這兩個文件?這將過濾所有其他交易,並讓我只看到類型6的那些。

謝謝。

回答

1

在Beyond Compare 4.1.1(當前版本)中,您所要求的是不可能的。

最接近你所描述的是隻顯示與特定字符串匹配的文本內的差異。

使用Define Unimportant Text in Beyond Compare指令定義與「。transactionType:6.」匹配的正則表達式語法元素。

定義語法元素後,單擊規則工具欄按鈕(裁判圖標)。在「重要性」選項卡中,選中新語法元素旁邊的框,並取消選中所有其他語法元素以使其不重要。這隻會突出顯示與您定義的語法元素相匹配的行中的差異。

+0

謝謝你的帖子。它教會了我幾件事,但不幸的是沒有滿足我的需求。我需要所有不包含字符串(或不匹配正則表達式)的行爲** hidden **,並只顯示包含匹配表達式的行。你所描述的是如何比較包含匹配表達式的行。 – omouri

+0

問題是相同類型的事務可能在兩個文件的不同時間發生(不對齊),它們甚至可能與其他事務交錯。所以,我想只能查看和比較特定類型的交易。 – omouri

+0

Beyond Compare不支持篩選以僅顯示包含特定字符串的行。您可以做的最好的只是顯示包含特定字符串的差異。 –

0

這是我能夠在BC4中完成所需行爲的方式。

BC支持在打開文件進行比較時運行「預處理器」應用程序。 所以我所做的就是做一個簡單的可執行文件包含3個參數(的argv []):

  1. 到原始文件的路徑
  2. 將處理文件的路徑(這將最終被打開進行比較BC)
  3. 含有線分隔的搜索串更多關於這個下文)txt文件(路徑

上述項數3可僅包含一個條目(使用相同的例子作爲原始質詢),例如作爲「transactionType:6」。然後,可執行文件搜索原始文件的每一行(上面的第1項),查找上面第3項中定義的搜索子字符串。每次擊中時,整行被複制(附加)到輸出文件(上面的項目2)。

接下來,你需要定義一個BC文件格式(在Mac上你去超越比較菜單,點擊文件格式...)。選擇您的文件的擴展名並點擊轉換選項卡。以下面的截圖爲例。 注:%S由BC限定爲指的是原始文件(第1項)和%叔是指經處理的文件的路徑的路徑(第2項)。

screenshot

所以,當你打開FILE1.TXTFILE2.TXT進行比較,BC將調用您的可執行文件(每次一個),然後打開生成的文件(項目2)。這將有效地顯示兩個文件的「過濾」版本,只顯示包含搜索子字符串的行。

另請注意,參數將是某種由BC內部生成的臨時路徑。

下面是上述一個快速和骯髒的執行可執行文件的:

#include <iostream> 
#include <fstream> 
#include <list> 
using namespace std; 

int main(int argc, const char * argv[]) 
{ 

ifstream inputFile (argv[1]); 
ifstream substringFile (argv[3]); 
ofstream outputFile; 

outputFile.open(argv[2]); 

//build the list of substrings from the substring input file 
list<string> substringList; 
string line; 

//TODO: make this safer 
while (getline(substringFile, line)) 
{ 
    substringList.push_back(line); 
} 

//for each substring in the list 
for (list<string>::const_iterator iter = substringList.begin(); iter != substringList.end(); iter++) 
{ 
    if (inputFile.is_open()) 
    { 
     //for all the lines in the file 
     while (getline(inputFile, line)) 
     { 
      //Find the current substring 
      if (line.find(*iter) != string::npos) 
      { 
       outputFile << line << "\n"; 
      } 
     } 
    } 

    //go back to the beginning of the file 
    inputFile.clear(); 
    inputFile.seekg(0, ios::beg); 
} 

inputFile.close(); 
outputFile.close(); 

return 0; 
} 

希望這有助於!

相關問題