Beyond Compare 4: Как показать только строки, содержащие определенную строку?

Я пытаюсь сравнить два файла журнала, содержащие список транзакций. Поля этих транзакций определяются внутри самой строки. например:

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

В одном файле журнала транзакции типа transactionType 6 могут появляться последовательно, а в другом файле они могут чередоваться с другими типами транзакций. Таким образом, хотя идентификатор транзакции может быть другим, они все равно будут в том же порядке и будут содержать одни и те же данные.

Как я могу отфильтровать или иным образом показать только те строки в обоих файлах, которые содержат строку "transactionType: 6"? Это отфильтровало бы все остальные транзакции и позволило бы мне видеть только те, которые имеют тип 6.

Спасибо.


person omouri    schedule 21.09.2015    source источник


Ответы (2)


То, о чем вы спрашиваете, невозможно в Beyond Compare 4.1.1 (текущая версия).

Самое близкое, что вы можете получить к тому, что вы описываете, - это отображать только различия в тексте, соответствующем определенной строке.

Определите элемент грамматики регулярного выражения, соответствующий ".transactionType: 6.", используя Определить неважный текст в Beyond Compare.

После того, как вы определили элемент грамматики, нажмите кнопку панели инструментов «Правила» (значок судьи). На вкладке «Важность» установите флажок рядом с новым элементом грамматики и снимите все остальные элементы грамматики, чтобы сделать их неважными. Это выделит только различия в строках, которые соответствуют определенному вами элементу грамматики.

person Chris Kennedy    schedule 24.09.2015
comment
Спасибо вам за публикацию. Это научило меня нескольким вещам, но, к сожалению, не удовлетворяет мои потребности. Мне нужно, чтобы все строки, не содержащие строку (или не соответствующие регулярному выражению), были скрытыми и отображались только те строки, которые содержат соответствующее выражение. Вы описали, как сравнивать только строки, содержащие совпадающее выражение. - person omouri; 24.09.2015
comment
Проблема в том, что однотипные транзакции могут появляться в двух файлах в разное время (не выровнены), они могут даже чередоваться с другими транзакциями. Итак, я хотел бы иметь возможность видеть и сравнивать транзакции только с определенным типом. - person omouri; 24.09.2015
comment
Beyond Compare не поддерживает фильтрацию для отображения только строк, содержащих определенную строку. Лучшее, что вы можете сделать, это отображать только различия, содержащие определенную строку. - person Chris Kennedy; 28.09.2015
comment
Спасибо, Крис. Я думаю, то, что я хочу, не поддерживается. Я надеюсь, что эта функция будет добавлена ​​в будущих версиях. Если вы отредактируете свой ответ, включив в него то, что я прошу, невозможно, я отмечу это как принятое решение. - person omouri; 29.09.2015

Вот как мне удалось добиться желаемого поведения в BC4.

BC поддерживает запуск приложения «препроцессор», поскольку оно открывает файл для сравнения. Итак, что я сделал, так это сделал простой исполняемый файл, который принимает 3 аргумента (argv[]):

  1. Путь к исходному файлу
  2. Путь к обрабатываемому файлу (который в итоге будет открыт для сравнения БК)
  3. Путь к текстовому файлу, содержащему поисковые подстроки с разделителями строк (подробнее об этом ниже)

Пункт номер 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