Объединение строк текста, где строка заканчивается определенным условием c - PullRequest
0 голосов
/ 14 июля 2020

Мне недавно предоставили новый, специально созданный инструмент для манипулирования текстовыми данными в базе данных, и одна функция поставила меня в тупик, так как у меня нет опыта работы с C# и моими коллегами, которые не смогли придумать с решением из-за нехватки времени.

Инструмент, который мне дали, имеет построитель выражений для применения правил для очистки обычного текста. Это объем предоставленной мне инструкции:

Используйте код C# для написания ваших выражений. Используйте вспомогательную строковую переменную «Text» для ссылки на весь текст или вспомогательную строковую переменную «Lines» [] для ссылки на отдельные текстовые строки. Вы также можете использовать вспомогательную переменную Builder (StringBuilder) для создания вывода. Выражение должно либо возвращать строковое значение, либо строковый массив.

Я создаю правила для очистки данных с помощью определенных c ключевых слов, найденных в конце строки, и мне нужно написать выражение / rule, которое позволит мне объединить строку с определенным ключевым словом c со следующей строкой. У меня есть действующее правило для перемещения строк ВВЕРХ, если строка начинается с определенного ключевого слова c, но мне нужно создать его, чтобы объединить его там, где строки заканчиваются ключевым словом.

Пример входных данных

Mr. John and
Mrs. Mary Smith
The Foundation for
the Lord's Children
Widgets Incorporated
Loyal Order of
Bullwinkle the Moose

Ожидаемый результат

Mr. John and Mrs. Mary Smith
The Foundation for the Lord's Children
Widgets Incorporated
Loyal Order of Bullwinkle the Moose

Для дальнейшего ознакомления с рабочим выражением, которое объединяет строки, начинающиеся с ключевого слова вверх (строка [i-1] и строка [i]), с предыдущей строкой:

for (
var i = 0; i < Lines.Length; i++) {
    if (!Lines[i].StartsWith(" "))
    if (!Lines[i].StartsWith("and "))
    if (!Lines[i].StartsWith("of "))
    if (!Lines[i].StartsWith("for "))
    if (!Lines[i].StartsWith("at "))
    if (!Lines[i].StartsWith("the "))
    if (i > 0) Builder.AppendLine();
    Builder.Append(" ").Append(Lines[i]);
}
return Builder.ToString();

Со следующими образцами данных и ожидаем вывода

Sample Input:
John
and Mary
and Andy Smith
Loyal Order
of Moose
Cineplex Movie Theater
Center
for the Blind

Expected Output:
John and Mary and Andy Smith
Loyal Order of Moose
Cineplex Movie Theater
Center for the Blind

Я надеюсь, что это простая проблема, но обратите внимание, что это простой построитель выражений, и я не знаю полных ограничений или возможностей, и он был специально построен для нашей компании, поэтому у меня мало деталей, которые я могу предоставить. Я предоставлю любые разъяснения, которые у меня есть, но у меня нет «образца» решения, которое я мог бы предоставить, так как я не смог продвинуться вперед, изменив рабочий запрос для работы, по сути, в другом направлении.

Чтобы прояснить вопрос: как мне написать al oop, который проверяет все строки, а затем объединяет / объединяет строку [i] и строку [i + 1], когда строка [i] заканчивается указанной строкой c (для примера примеры будет «и», «the», «of», «at»)

Любая помощь приветствуется!

РЕДАКТИРОВАТЬ: Вопрос был закрыт из-за недостаточной ясности, однако в конечном итоге решение было доставлено. Если у кого-то еще есть подобные проблемы, вот рабочее решение.

for (var i = 0; i < Lines.Length; i++) {
    Builder.Append(Lines[i]);
    
    if (Lines[i].EndsWith(" and") || Lines[i].EndsWith(" of") ||
        Lines[i].EndsWith(" for") || Lines[i].EndsWith(" at") ||
        Lines[i].EndsWith(" the")) {
        
        if (i < (Lines.Length - 1)) {
            Builder.Append(" ").Append(Lines[i + 1]);
            i++;
        }
    }
        
    Builder.AppendLine("");
}
return Builder.ToString();

Ответы [ 3 ]

1 голос
/ 14 июля 2020

Это должно работать ...

for (var i = 0; i < Lines.Count; i++)
        {
            var keywords = new List<string>{" ", "and", "of", "for", "at", "the"};
            if (i > 0)
            {
                if (keywords.Any(x => Lines[i].StartsWith(x + " ") || Lines[i - 1].EndsWith(" " + x)))
                {
                    Builder.Append(" ");
                }
                else
                {
                    Builder.AppendLine();
                }
            }
            
            Builder.Append(Lines[i]);
        }
0 голосов
/ 20 июля 2020

Вот рабочее решение которое было разработано

for (var i = 0; i < Lines.Length; i++) {
    Builder.Append(Lines[i]);
    
    if (Lines[i].EndsWith(" and") || Lines[i].EndsWith(" of") ||
        Lines[i].EndsWith(" for") || Lines[i].EndsWith(" at") ||
        Lines[i].EndsWith(" the")) {
        
        if (i < (Lines.Length - 1)) {
            Builder.Append(" ").Append(Lines[i + 1]);
            i++;
        }
    }
        
    Builder.AppendLine("");
}
return Builder.ToString();
0 голосов
/ 14 июля 2020

Что-то вроде этого должно помочь:

{
...
if (!Lines[i].TrimEnd().EndsWith(" and"))
if (!Lines[i].TrimEnd().EndsWith(" of"))
if (!Lines[i].TrimEnd().EndsWith(" for"))
if (!Lines[i].TrimEnd().EndsWith(" at"))
if (!Lines[i].TrimEnd().EndsWith(" the"))
if (i > 0) Builder.AppendLine();
Builder.Append(" ").Append(Lines[i + 1]);
}
return Builder.ToString();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...