我有一个大于 200MB 的大文件。该文件是来自外部方的 CSV 文件,但遗憾的是,我不能像\r\n
定义新行那样逐行读取文件。
目前我正在使用这种方法阅读所有行:
var file = File.ReadAllText(filePath, Encoding.Default);
var lines = Regex.Split(file, @"\r\n");
for (int i = 0; i < lines.Length; i++)
{
string line = lines[i];
...
}
我该如何优化呢?在我的 225MB 文件上调用 ReadAllText 后,该进程使用了超过 1GB 的 RAM。在我的情况下是否可以使用流式传输方法,我需要使用我的\r\n
模式拆分文件?
EDIT1:
您使用File.ReadLines和StreamReader的解决方案将不起作用,因为它将文件中的每一行视为一行。我需要使用我的\r\n
模式拆分文件。使用我的代码读取文件会产生 758.371 行(这是正确的),而正常的行数会产生超过 150 万行。
解决方案
public static IEnumerable<string> ReadLines(string path)
{
const string delim = "\r\n";
using (StreamReader sr = new StreamReader(path))
{
StringBuilder sb = new StringBuilder();
while (!sr.EndOfStream)
{
for (int i = 0; i < delim.Length; i++)
{
Char c = (char)sr.Read();
sb.Append(c);
if (c != delim[i])
break;
if (i == delim.Length - 1)
{
sb.Remove(sb.Length - delim.Length, delim.Length);
yield return sb.ToString();
sb = new StringBuilder();
break;
}
}
}
if (sb.Length>0)
yield return sb.ToString();
}
}