Вот как мне удалось добиться желаемого поведения в BC4.
BC поддерживает запуск приложения «препроцессор», поскольку оно открывает файл для сравнения. Итак, что я сделал, так это сделал простой исполняемый файл, который принимает 3 аргумента (argv[]):
- Путь к исходному файлу
- Путь к обрабатываемому файлу (который в итоге будет открыт для сравнения БК)
- Путь к текстовому файлу, содержащему поисковые подстроки с разделителями строк (подробнее об этом ниже)
Пункт номер 3 выше может содержать только одну запись (если использовать тот же пример, что и исходный вопрос), например "transactionType: 6". Затем исполняемый файл ищет в каждой строке исходного файла (пункт 1 выше) поисковые подстроки, определенные в пункте 3 выше. При каждом попадании вся строка копируется (добавляется) в выходной файл (пункт 2 выше).
Затем вам нужно определить формат файла в BC (на Mac откройте меню Beyond Compare и нажмите Форматы файлов...). Выберите расширение вашего файла и нажмите на вкладку Конвертация. Используйте скриншот ниже в качестве примера. Примечание. %s определяется BC как ссылка на путь к исходному файлу (элемент 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;
}
Надеюсь это поможет!
person
omouri
schedule
20.10.2015