Сравните два документа и измените цвет текста

Я хочу сравнить 2 файла с помощью RichTextBox и загрузить их в новые RichTextBox с определенным текстом, который отображается зеленым цветом, а другой текст - красным.

Я имею в виду:

ДОКУМЕНТ 1

C1    147417 111.111 222.222 0 TEXT
U13   IC-123456 1234 9876 360 TEXT
R123 13866 -99.9 123.456 100 TEXT
U24   IC-123456 -14 -50 90 TEXT
............more lines............

ДОКУМЕНТ 2

1   U13  IC-123456   SOMETEXT   1.00   EA P C n   Y
                     EC5547,3-UP                 50
1   U24  IC-123456   SOMETEXT   1.00   EA P C n   Y
                     EC5547,3-UP                 50
1   C1  147417   TEXT   2.00   EA P C n   Y
                 0603,EC0303             50
1   R123  138666   MORETEXT   2.00 EA P C n   Y
                                             50
......................more lines..........................

И я хотел бы сопоставить 1-й и 2-й столбцы в первом файле, чтобы увидеть, существуют ли они в какой-либо строке во втором файле. Если они совпадают, совпадающие элементы будут окрашивать совпавший текст в зеленый цвет, а все остальное — в красный.

  • Есть какой-либо способ сделать это?
  • Как я могу сравнить 1-й столбец со столбцами в другом файле?
  • Можно ли изменить цвет текста в RTB, а не всей строки?

ИЗМЕНИТЬ:

    private void checkMatchesInGCandBOM()
    {
        // Splits the text up to compare with the other text.
        var combinedSplit = combinedPlacementsRichTextBox.Text.Split('\n');

        string[] splitLines;

        foreach (var line in combinedSplit)
        {
            Match theMatch = Regex.Match(line, @"^.*");

            if (theMatch.Success)
            {
                // Stores the matched value in string output.
                string output = theMatch.Value;

                // Replaces the tabs with spaces.
                output = Regex.Replace(output, @"\s+", " ");
                splitLines = output.Split(' ');

                int pos = 0, pos2 = 0;
                pos = bomRichTextBox.Find(splitLines[0], pos, RichTextBoxFinds.MatchCase);
                pos2 = bomRichTextBox.Find(splitLines[1], pos2, RichTextBoxFinds.MatchCase);

                while (pos != -1)
                {
                    if (bomRichTextBox.SelectedText == splitLines[0] && bomRichTextBox.SelectedText != "")
                    {
                        int my1stPosition = bomRichTextBox.Find(splitLines[1]);
                        bomRichTextBox.SelectionStart = my1stPosition;
                        bomRichTextBox.SelectionLength = splitLines[0].Length;
                        bomRichTextBox.SelectionFont = new System.Drawing.Font("Arial", 8, FontStyle.Underline);
                        bomRichTextBox.SelectionColor = Color.Green;
                    }

                    pos = bomRichTextBox.Find(splitLines[0], pos + 1, RichTextBoxFinds.MatchCase);
                }

                while (pos2 != -1)
                {
                    if (bomRichTextBox.SelectedText == splitLines[1] && bomRichTextBox.SelectedText != "")
                    {
                        int my1stPosition = bomRichTextBox.Find(splitLines[0]);
                        bomRichTextBox.SelectionStart = my1stPosition;
                        bomRichTextBox.SelectionLength = splitLines[1].Length;
                        bomRichTextBox.SelectionFont = new System.Drawing.Font("Arial", 8, FontStyle.Underline);
                        bomRichTextBox.SelectionColor = Color.Blue;
                    }

                    pos2 = bomRichTextBox.Find(splitLines[1], pos2 + 1, RichTextBoxFinds.MatchCase);
                }
            }
        }

Однако, похоже, это не работает должным образом....!

Все крайние левые столбцы должны были быть ПОЛНОСТЬЮ зелеными, но по какой-то причине некоторые из них черные, а некоторые черно-зеленые. Также следующий столбец должен был найти все и изменить цвет на полный синий. выглядит так, как показано выше.

Новый скриншот того, что происходит.


person theNoobGuy    schedule 01.08.2011    source источник
comment
Не могли бы вы дать немного больше информации? Как оформлены ваши документы? Являются ли они плоскими с n символами между каждым новым столбцом? Разделители табуляции?   -  person Alec Sanger    schedule 01.08.2011
comment
Они разделены пробелами, но выше я отформатировал их с помощью 3, чтобы сделать их более читабельными. Столбцы также не имеют фиксированной ширины.   -  person theNoobGuy    schedule 01.08.2011
comment
Предполагая, что первые два столбца разделены пробелами, как вы говорите, вы можете разделить пробелы и создать строку поиска с первыми двумя элементами массива. Однако все может очень быстро запутаться, если ваши данные не согласуются.   -  person Alec Sanger    schedule 02.08.2011


Ответы (1)


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

Когда у вас появится способ отделить эти столбцы от остального документа, прокрутите и вызовите что-то вроде этого:

if (richTextBox2.Find(mystring)>0)
{
    int my1stPosition=richTextBox1.Find(strSearch);
    richTextBox2.SelectionStart=my1stPosition;
    richTextBox2.SelectionLength=strSearch.Length;
    richTextBox2.SelectionFont=fnt;
    richTextBox2.SelectionColor=Color.Green;
} 

(код в основном взят из http://social.msdn.microsoft.com/forums/en-US/csharpgeneral/thread/651faf9b-ae32-4c99-b619-d3afd89477e1/)

«SelectionColor» в основном говорит RTB изменить цвет выделенного текста. Вы заставляете программу автоматически выбирать текст для вас с помощью «SelectionStart» и «SelectionLength».

Очевидно, измените параметры шрифта на то, что вам нужно. Если вы хотите выделить остальную часть документа красным цветом, вы можете сделать новый RTB красным по умолчанию, так как это звучит так, как будто он используется только для сравнения.

Вышеупомянутое будет работать только для первого вхождения. Если вы хотите, чтобы он выделял ВСЕ вхождения, вы можете проверить IndexOfAll. См. эту страницу для получения дополнительной информации: http://www.dijksterhuis.org/manipulating-strings-in-csharp-finding-all-occurrences-of-a-string-within-another-string/

IndexOfAll вернет массив со списком каждой позиции, в которой подстрока находится в другой строке. Как только вы найдете их, прокрутите массив и используйте тот же код, что указан выше, чтобы изменить цвет каждого набора.

person Alec Sanger    schedule 01.08.2011
comment
Я пытаюсь заставить это работать, и это то, что я до сих пор пытался проверить каждую строку.. однако это не работает должным образом.. (проверьте выше в моем сообщении) - person theNoobGuy; 02.08.2011
comment
Попробуйте взглянуть на это: msdn.microsoft.com/en-us/library/ - person Alec Sanger; 03.08.2011
comment
Я снова отредактировал сообщение выше. Мы приближаемся к разгадке!! Просто еще одна ошибка, в которой я не уверен - person theNoobGuy; 03.08.2011
comment
Кроме того, используя ваш код, кажется, что по большей части правильно соответствует значение... Однако... ошибка, с которой я столкнулся... скажем, это значение равно C42 и позже в тексте он находит C4. Этот (C4) не станет синим, даже если он совпал. Однако, если он найдет C45 после C42 и/или C4, он сделает этот (C45) синим... - person theNoobGuy; 03.08.2011
comment
Я бы просто поставил несколько точек останова, чтобы проверить значение первого элемента. Пройдите и убедитесь, что он правильно разделяет эти значения. Хотя кажется, что программа приближается к функциональной, я бы, вероятно, структурировал ее немного по-другому. Кроме того, как вы назначаете начальную точку для выделения текста? - person Alec Sanger; 03.08.2011
comment
Я снова обновил код выше. Получается немного иначе, чем раньше. Как бы вы его структурировали, ведь мой способ не работает! :П хаха. Кроме того, мне нужно проверить, совпадает ли один из них со следующим 1 в той же строке, и я не уверен, как это сделать. - person theNoobGuy; 03.08.2011
comment
Если вы хотите, чтобы я взглянул на настоящий проект, отправьте мне электронное письмо по адресу, указанному в моей учетной записи. Довольно сложно диагностировать это, не имея возможности увидеть его полностью. Если вы не хотите, я все же предлагаю установить точки останова и отслеживать значения ваших переменных и результаты ваших операций сопоставления/поиска. - person Alec Sanger; 03.08.2011
comment
HairyCow19 в Gmail. В SO не одобряются длительные обсуждения взад и вперед, поэтому мы можем общаться по электронной почте, и вы можете обновить свой пост, когда будет получен ответ. - person Alec Sanger; 03.08.2011