我有一個多兆字節的.sql文件,在每10k左右的換行符上有GO語句。我試圖想出一種逐行讀取文件的方法,直到我找到一個只有「去」和換行符的新行,然後將讀取的內容返回給調用者,然後讀取下一堆文字,直到我再次打開GO。閱讀文本文件到GO
Peek只讓我讀取一個字符,在Framework 4.0上用C#做這項工作的聰明方法是什麼?
謝謝。
我有一個多兆字節的.sql文件,在每10k左右的換行符上有GO語句。我試圖想出一種逐行讀取文件的方法,直到我找到一個只有「去」和換行符的新行,然後將讀取的內容返回給調用者,然後讀取下一堆文字,直到我再次打開GO。閱讀文本文件到GO
Peek只讓我讀取一個字符,在Framework 4.0上用C#做這項工作的聰明方法是什麼?
謝謝。
這應該完全符合你的意思。
使用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();
}
}
如果您使用SQL Server,則不需要手動解析文件。改用Server.ConnectionContext.ExecuteNonQuery方法。它是SMO的一部分。
參見Jon Galloway的Handling "GO" Separators in SQL Scripts - the easy way。
如果你讀了BufferedStream的文件,然後,一旦你讀了「GO」的令牌,你可以尋求回行的開頭。
如果該文件將永遠是磁盤(而不是在內存中或從網絡連接來),你也可以只用一個FileStream,因爲這也可搜索。
根據「返回所讀內容」的要求,它聽起來不像「ExecuteNonQuery」是合適的。但是我的SQL經驗有限。 – 2010-11-12 04:22:02