Лучший способ разбить строку на слово (разделитель пакетов SQL) - PullRequest
1 голос
/ 12 апреля 2010

У меня есть класс, который я использую, чтобы «разделить» строку команд SQL с помощью разделителя пакетов - например, «GO» - в список команд SQL, которые выполняются по очереди и т. Д.

...
private static IEnumerable<string> SplitByBatchIndecator(string script, string batchIndicator)
{
    string pattern = string.Concat("^\\s*", batchIndicator, "\\s*$");
    RegexOptions options = RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Multiline;
    foreach (string batch in Regex.Split(script, pattern, options))
    {
        yield return batch.Trim();
    }
}

Моя текущая реализация использует Regex с yield, но я не уверен, что это "лучший" способ.

  • Это должно быть быстро
  • Он должен обрабатывать большие строки (например, у меня есть несколько скриптов размером 10 МБ)
  • Самое сложное (что вышеупомянутый код в настоящее время не делает) - это принять во внимание цитируемый текст

В настоящее время следующий SQL будет некорректно разделен:

var batch = QueryBatch.Parse(@"-- issue...
insert into table (name, desc)
values('foo', 'if the
go
is on a line by itself we have a problem...')");

Assert.That(batch.Queries.Count, Is.EqualTo(1), "This fails for now...");

Я думал о парсере на основе токенов, который отслеживает состояние открытых закрытых кавычек, но не уверен, что Regex сделает это.

Есть идеи!?

1 Ответ

3 голосов
/ 12 апреля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...