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

Filter 超越比较4:如何仅显示包含特定字符串的行?,filter,hide,show,beyondcompare4,Filter,Hide,Show,Beyondcompare4,我试图比较包含事务列表的两个日志文件。这些事务的字段在行本身中定义。例如: transactionID: 1, transactionType: 6, transactionData: 123456 transactionID: 2, transactionType: 6, transactionData: 654321 在一个日志文件中,transactionType 6事务可能连续出现,而在另一个文件中,它们可能与其他事务类型交错出现。因此,尽管transactionID可

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

    transactionID: 1, transactionType: 6, transactionData: 123456
    transactionID: 2, transactionType: 6, transactionData: 654321
在一个日志文件中,transactionType 6事务可能连续出现,而在另一个文件中,它们可能与其他事务类型交错出现。因此,尽管transactionID可能有所不同,但它们的顺序仍然相同,并且包含相同的数据

如何筛选或仅显示包含字符串“transactionType:6”的两个文件中的行?这将过滤掉所有其他事务,只允许我查看类型为6的事务


谢谢。

您的问题在Beyond Compare 4.1.1(当前版本)中不可能实现

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

使用说明定义与“.transactionType:6.”匹配的正则表达式语法元素


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

以下是我在BC4中实现所需行为的方法

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

  • 原始文件的路径
  • 已处理文件的路径(最终将由BC打开以供比较)
  • 包含以行分隔的搜索子字符串的txt文件的路径(下面详细介绍)
  • 上面第3项只能包含一个条目(使用与原始问题相同的示例),例如“transactionType:6”。然后,可执行文件在原始文件(上面的项目1)的每一行中搜索上面的项目3中定义的搜索子字符串。每次点击时,整行被复制(追加)到输出文件中(上面的第2项)

    接下来,您需要在BC中定义一种文件格式(在Mac上,您进入“超越比较”菜单,然后单击“文件格式…”。选择文件的扩展名并单击“转换”选项卡。以下面的屏幕截图为例。 注:%s由BC定义为指原始文件(项目1)的路径,%t指已处理文件(项目2)的路径

    因此,当您打开File1.txtFile2.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;
    }
    
    #包括
    #包括
    #包括
    使用名称空间std;
    int main(int argc,const char*argv[]
    {
    ifstream输入文件(argv[1]);
    ifstream子字符串文件(argv[3]);
    流输出文件;
    outputFile.open(argv[2]);
    //从子字符串输入文件生成子字符串列表
    列表子字符串列表;
    弦线;
    //TODO:让这更安全
    while(getline(子字符串文件,行))
    {
    子字符串列表。推回(行);
    }
    //对于列表中的每个子字符串
    对于(list::const_迭代器iter=substringList.begin();iter!=substringList.end();iter++)
    {
    if(inputFile.is_open())
    {
    //对于文件中的所有行
    while(getline(inputFile,line))
    {
    //查找当前子字符串
    if(line.find(*iter)!=string::npos)
    {
    
    outputFile谢谢你的帖子。它教会了我一些东西,但不幸的是不能满足我的需要。我需要所有不包含字符串(或不匹配正则表达式)的行隐藏,并且仅显示包含匹配表达式的行。您描述的是如何仅比较包含匹配表达式的行。问题是相同类型的事务可能在两个文件中的不同时间出现(未对齐),它们甚至可能与其他事务交错。因此,我只希望能够查看和比较特定类型的事务。Beyond compare不支持筛选,只显示包含特定字符串的行。您最好只显示包含特定字符串的差异。谢谢Chris。我猜怎么着“我想要”不受支持。我希望在将来的版本中添加此功能。如果您编辑您的答案,使其包含我要求的内容不可能,我会将其标记为已接受的解决方案。