2015-09-21 27 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; 
} 

希望这有助于!

相关问题