我有一個日誌文件可以變得非常大。如何讀取特定格式的數據
我的日誌文件中的信息是以某種格式存在的,我想將它們分隔成一個獨立的數據塊。
例如,
這是開始。
等等等等
等等等等等等等等等等等等
胡說
這是開始。
等等等等
等等等等等等等等等等等等
等等等等等等等等等等等等
等等等等等等等等等等等等
胡說
我想要得到的信息從「這是起點」到下一個「這是起點」開始之前。做這個的最好方式是什麼?我的代碼是在C#中。
我有一個日誌文件可以變得非常大。如何讀取特定格式的數據
我的日誌文件中的信息是以某種格式存在的,我想將它們分隔成一個獨立的數據塊。
例如,
這是開始。
等等等等
等等等等等等等等等等等等
胡說
這是開始。
等等等等
等等等等等等等等等等等等
等等等等等等等等等等等等
等等等等等等等等等等等等
胡說
我想要得到的信息從「這是起點」到下一個「這是起點」開始之前。做這個的最好方式是什麼?我的代碼是在C#中。
下面的代碼將所述文件分割成由"This is the start."
線劃定的塊,並調用的回調方法來處理每個數據塊:
public static void ProcessInChunks(string inputFilename,
string delimiter, Action<IEnumerable<string>> processChunk)
{
using (var enumerator = File.ReadLines(inputFilename).GetEnumerator())
{
if (!enumerator.MoveNext())
// The file is empty.
return;
var firstLine = enumerator.Current;
if (firstLine != delimiter)
throw new InvalidOperationException(
"Expected the first line to be a delimiter.");
List<string> currentChunk = new List<string>();
while (enumerator.MoveNext())
{
if (enumerator.Current == delimiter)
{
processChunk(currentChunk);
currentChunk = new List<string>();
}
else
currentChunk.Add(enumerator.Current);
}
processChunk(currentChunk);
}
用法:
ProcessInChunks(@"myfile.log", "This is the start.",
chunk => { /* do something here */ });
感謝Timwi的回答。我會試試這個。我的另一個問題是,這是閱讀大文件的最佳方式嗎? – user393148 2010-09-08 00:56:37
@ user393148 - 對於編程中的一大類問題,沒有簡單而直接的答案。你總是需要看看每個人的情況。我剛剛編輯了這個答案,以使它對於非常大的文件更加高效。我以前的版本會將整個文件加載到內存中,但新版本會逐步處理它。 – Timwi 2010-09-08 01:14:36
謝謝Timwi ... – user393148 2010-09-08 17:56:33
如果可以」不會改變日誌創建過程,@Timwi的答案會很好。如果您可以調整日誌創建過程,則可以在每次要寫入This is the start.
時創建新的日期標記日誌文件名。這將創建多個日誌文件,但它們已經以所需的方式分割。顯然如果找到的文本可以改變,這將無法工作。
謝謝愛德華。我正在努力將其變爲標準格式。在此之前,我必須使用解決方法。謝謝 – user393148 2010-09-08 17:48:38
線是由一個新的行分開? – halfdan 2010-09-08 00:47:18
可能會或可能不會。除「這是開始」外,沒有這種格式。 – user393148 2010-09-08 00:55:58