我正在尝试比较包含事务列表的两个日志文件。这些事务的字段在行本身中定义。例如:
transactionID: 1, transactionType: 6, transactionData: 123456
transactionID: 2, transactionType: 6, transactionData: 654321
在一个日志文件中,transactionType 6事务可能会连续出现,而在另一个文件中,它们可能与其他事务类型交错。因此,虽然transactionID可能不同,但它们仍然处于相同的顺序并包含相同的数据。
我如何过滤或者只显示包含字符串“transactionType:6”的两个文件中的行?这将过滤掉所有其他交易,并允许我只查看类型为6的那些。
谢谢。
答案 0 :(得分:1)
Beyond Compare 4.1.1(当前版本)无法提出您的要求。
您最接近您所描述的内容的是,只显示与特定字符串匹配的文字内的差异。
定义与"。 transactionType:6匹配的正则表达式语法元素。"使用Define Unimportant Text in Beyond Compare说明。
在您定义了语法元素后,单击“规则”工具栏按钮(裁判图标)。在“重要性”选项卡中,选中新语法元素旁边的框,并取消选中所有其他语法元素,使其不重要。这只会突出显示与您定义的语法元素匹配的行的差异。
答案 1 :(得分:0)
这是我在BC4中完成所需行为的方式。
BC支持运行"预处理器"应用程序打开文件进行比较。 所以我做的是制作一个简单的可执行文件,它带有3个参数(argv []):
上面的项目编号3只能包含一个条目(使用与原始问题相同的示例),例如" transactionType:6" 。然后,可执行文件搜索原始文件的每一行(上面的第1项),以查找上面第3项中定义的搜索子字符串。每次命中时,整行都被复制(追加)到输出文件中(上面的第2项)。
接下来,您需要在BC中定义文件格式(在Mac上,您转到超越比较菜单,然后单击文件格式... )。选择文件的扩展程序,然后点击转化标签。使用下面的屏幕截图作为示例。 注意:BC定义 %s 以引用原始文件(第1项)和 %t 的路径指处理文件的路径(第2项)。
因此,当您打开 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;
}
希望这有帮助!