在前一篇「[.NET]大檔案的 Replace, Split 方式」裡面,
有一段是將字串中的 "-" Replace 成 空字串,
原本的內容中並沒有 "-" 呀~~
因為我們將整個檔案讀到 ByteArray 之中,
然後再透過 BitConverter.ToString 時,會將每個 Byte 中間用 "-" 去串接。
所以我們可以參考「Convert Stream to IEnumerable. If possible when “keeping laziness”」
從 FileStream 中順序地將一個 Byte 一個 Byte 讀出來處理,
就不用多處理那個 Replace 的問題了。
所以原有的 Split2 Method 調整成直接處理 Stream ,就可以了,如下,
static void Main(string[] args)
{
string bigFile = @"很大的檔案";
var file = new FileStream(bigFile, FileMode.Open);
//讀取全部的資料
//var lines = StreamWithSplitEnumerable(file, "0D0A");
//讀取前5筆資料
var lines = StreamWithSplitEnumerable(file, "0D0A").Take(5);
foreach (string s in lines)
Console.WriteLine(s);
Console.ReadKey();
}
public static IEnumerable<string> StreamWithSplitEnumerable(Stream stream, string splitStr)
{
if (stream == null)
yield break;
string line = string.Empty;
for (int i = stream.ReadByte(); i != -1; i = stream.ReadByte())
{
var bs = i.ToString("X2");
line += bs;
if (line.EndsWith(splitStr))
{
var returnValue = line.Substring(0, line.Length - splitStr.Length);
yield return returnValue;
Console.WriteLine(returnValue);
line = string.Empty;
}
}
}
參考資料
Convert Stream to IEnumerable. If possible when “keeping laziness”
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^