200MB 的大文件。该文件是来自外部方的 CSV 文件,但遗憾的是我不能逐行读取文件,因为 \r\n 用于定义新行。 目前我正在使用这种方法阅读所有行: var file = File.R-6ren">
gpt4 book ai didi

c# - 如何读取大文件并按 "\r\n"分割

转载 作者:行者123 更新时间:2023-11-30 19:18:21 30 4
gpt4 key购买 nike

我有一个>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 模式拆分文件?

编辑 1:您使用 File.ReadLinesStreamReader 的解决方案将不起作用,因为它将文件中的每一行视为一行。我需要使用我的 \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();
}
}

最佳答案

您可以使用 File.ReadLines 返回 IEnumerable<string>而不是将整个文件加载到内存中。

foreach(var line in File.ReadLines(@filePath, Encoding.Default)
.Where(l => !String.IsNullOrEmpty(l)))
{
}

关于c# - 如何读取大文件并按 "\r\n"分割,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13085977/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com