超越比较4:如何仅显示包含特定字符串的行?

时间:2015-09-21 16:26:48

标签: filter hide show beyondcompare4

我正在尝试比较包含事务列表的两个日志文件。这些事务的字段在行本身中定义。例如:

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

在一个日志文件中,transactionType 6事务可能会连续出现,而在另一个文件中,它们可能与其他事务类型交错。因此,虽然transactionID可能不同,但它们仍然处于相同的顺序并包含相同的数据。

我如何过滤或者只显示包含字符串“transactionType:6”的两个文件中的行?这将过滤掉所有其他交易,并允许我只查看类型为6的那些。

谢谢。

2 个答案:

答案 0 :(得分:1)

Beyond Compare 4.1.1(当前版本)无法提出您的要求。

您最接近您所描述的内容的是,只显示与特定字符串匹配的文字内的差异。

定义与"。 transactionType:6匹配的正则表达式语法元素。"使用Define Unimportant Text in Beyond Compare说明。

在您定义了语法元素后,单击“规则”工具栏按钮(裁判图标)。在“重要性”选项卡中,选中新语法元素旁边的框,并取消选中所有其他语法元素,使其不重要。这只会突出显示与您定义的语法元素匹配的行的差异。

答案 1 :(得分:0)

这是我在BC4中完成所需行为的方式。

BC支持运行"预处理器"应用程序打开文件进行比较。 所以我做的是制作一个简单的可执行文件,它带有3个参数(argv []):

  1. 原始文件的路径
  2. 处理过的文件的路径(最终将打开以供BC比较)
  3. 包含行分隔搜索子字符串的txt文件的路径(详见下文)
  4. 上面的项目编号3只能包含一个条目(使用与原始问题相同的示例),例如" transactionType:6" 。然后,可执行文件搜索原始文件的每一行(上面的第1项),以查找上面第3项中定义的搜索子字符串。每次命中时,整行都被复制(追加)到输出文件中(上面的第2项)。

    接下来,您需要在BC中定义文件格式(在Mac上,您转到超越比较菜单,然后单击文件格式... )。选择文件的扩展程序,然后点击转化标签。使用下面的屏幕截图作为示例。 注意:BC定义 %s 以引用原始文件(第1项)和 %t 的路径指处理文件的路径(第2项)。

    screenshot

    因此,当您打开 File1.txt File2.txt 进行比较时,BC会调用您的可执行文件(每次一次)然后打开生成的文件(第2项)。这将有效地显示"过滤"两个文件的版本,仅显示包含搜索子字符串的行。

    另请注意, %t 参数将是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;
    }
    

    希望这有帮助!