Сравните два документа и измените цвет текста - PullRequest
0 голосов
/ 01 августа 2011

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

Что я имею в виду:

ДОКУМЕНТ 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, а не во всей строке?

EDIT:

    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);
                }
            }
        }

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

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

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

1 Ответ

1 голос
/ 01 августа 2011

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

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

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 вернет массив со спискомкаждой позиции подстрока лежит в другой строке.Как только вы найдете их, переберите массив и используйте тот же код, который указан выше, чтобы изменить цвет каждого набора.

...