如何读取大文件并按"\ r \n"拆分

dhr*_*hrm 2 .net c#

我有一个大文件> 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];
    ...
}
Run Code Online (Sandbox Code Playgroud)

我该如何优化呢?在我的225MB文件上调用ReadAllText后,该过程使用的RAM超过1GB.在我的情况下是否可以使用流式处理方法,我需要使用我的\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();
    }
}
Run Code Online (Sandbox Code Playgroud)

L.B*_*L.B 6

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

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

  • @DennisMadsen我无法理解你.`\ r \n`实际上意味着*新行*.你可以把你的几行发布到像pastebin这样的位置.试试这个(**`var chars = Environment.NewLine.ToCharArray();`**) (2认同)