Читать текстовый файл до GO - PullRequest
0 голосов
/ 12 ноября 2010

У меня есть мультимегабайтный файл .sql, операторы GO появляются на новых строках каждые 10k или около того. Я пытаюсь найти способ читать файл построчно, пока не найду новую строку, содержащую только «go» и символ новой строки, затем верну то, что было прочитано вызывающей стороне, а затем прочитал следующий пакет текста, пока я снова не нажму GO.

Peek позволяет мне читать только один символ, какой умный способ заставить это работать в C # на Framework 4.0?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 12 ноября 2010

Это должно в точности соответствовать тому, что вы говорили.
Вызвать эту функцию со строкой имени файла SQL-файла, и она вернет IEnumerable<string> (набор строк), каждый из которых содержит пакет SQL (каждый до оператора GO), который вы можете затем выполнить с помощью foreach или чего-либо еще.

public static IEnumerable<string> GetSqlBatches(string filename)
{
    using(StreamReader sr = new StreamReader(filename))
    {
        StringBuilder ReadSoFar = new StringBuilder();

        while (!sr.EndOfStream)
        {
            string line = sr.ReadLine();
            ReadSoFar.AppendLine(line);
            if (line.Trim() == "GO")
            {
                yield return ReadSoFar.ToString();
                ReadSoFar = new StringBuilder();
            }
        }
        sr.Close();
    }
}
0 голосов
/ 12 ноября 2010

Если вы читаете файл с BufferedStream , вы можете вернуться к началу строки, как только прочитаете токен GO.

Если файл всегда будет на диске (а не в памяти или из сетевого подключения), вы также можете просто использовать FileStream , поскольку он также доступен для поиска.

0 голосов
/ 12 ноября 2010

Если вы используете SQL Server, нет необходимости анализировать файл вручную.Вместо этого используйте метод Server.ConnectionContext.ExecuteNonQuery .Он является частью SMO.

См. Обработка разделителей «GO» в сценариях SQL - простой способ , автор Джон Галлоуэй.

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