如何在大文本文件中插入换行符

时间:2011-11-21 16:37:58

标签: c# .net

我有一个大文本文件(如1gb),我需要每40个字符插入换行符。

如何使用streamReader?

我尝试使用ReadBLock,但似乎无法使其工作。到目前为止,这是代码:

int index = 0;
try
{
    using (StreamReader sr = new StreamReader(@"C:\bigfile.txt"))
    {
        char [] buf = new char [1024];
        //sr.ReadBlock (buf, 0, 40);
        while (sr.ReadBlock (buf, index, 40) != 0)
        {
            using (StreamWriter sw = new StreamWriter(@"C:\bigfilelinebreak.txt"))
            {
                //Console.WriteLine(buf);
                sw.Write (buf);
                sw.WriteLine(Environment.NewLine);
            }
            index += 40;
        }

    }
}

3 个答案:

答案 0 :(得分:1)

您正在为每个ReadBlock创建一个新的StreamWriter。 (我不知道new StreamWriter(@"filename")的行为,但我会打赌这不是你想要发生的事情。此外,index的{​​{1}}参数是目标数组的索引,而不是文件的索引。因此,对于每次读取,它应该为0。当您按顺序从一个流式传输到另一个时,您无需考虑文件中的位置。 StreamReader / Writer将相应地移动基础流。

ReadBlock

答案 1 :(得分:1)

有一些问题:

  1. 您不需要递增索引 - 只需写入索引零。
  2. 您正在为每个块重新创建StreamWriter。
  3. 你可能写错了多少个字符(你没有检查你读了多少字符,在文件末尾可能少于40个字符)
  4. 尝试以下方法:

        try
        {
            using (StreamReader sr = new StreamReader(@"C:\bigfile.txt"))
            {
                using (StreamWriter sw = new StreamWriter(@"C:\bigfilelinebreak.txt"))
                {
                    char [] buf = new char[40];
                    int read = sr.ReadBlock (buf, 0, 40);
                    while (read != 0)
                    {
                        sw.Write(buf, 0, read);
                        sw.WriteLine();
                        read = sr.ReadBlock (buf, 0, 40);
                    }
                }
            }
        }
    

答案 2 :(得分:0)

目前,您正在重写每一行上的输出文件。这显然不是一个好计划。

我怀疑你想要这样的东西:

using (TextReader reader = File.OpenText(@"c:\bigfile.txt"))
{
    using (TextWriter writer = File.CreateText(@"C:\bigfilelinebreak.txt"))
    {
        char[] buffer = new char[40];
        int charsRead;
        while ((charsRead = reader.ReadBlock(reader, buffer, buffer.Length)) > 0)
        {
            writer.Write(buffer, 0, charsRead);
            writer.WriteLine();
        }
    }
}