难度慢速分割器文件txt?

时间:2013-12-03 14:06:31

标签: c# file split

我编写了一个将txt文件拆分成小块的程序 但我的问题是我的方法很慢 因为这个文件大小是1gb,我使用一个名为“pagesize”的变量,它将根据分割文件中的行数计算

问题是foreach很慢?

有更好的方法吗?

 private void button1_Click(object sender, EventArgs e)
    {
        string inputFile = @"G:\Programming\C#\c# tamrin reza\large-Orders.txt";

        int seed = 1000;
        const int pageSize = 5000;
        int count = 1;
        const string destinationFileName = @"F:\Output\";
        string outputFile;
        string baseName = "-CustomerApp";
        string extension = Path.GetExtension(inputFile);
        var lst = new List<string>();
        //FileInfo fileInfo = new FileInfo(inputFile);
        //long fileSize = fileInfo.Length / pageSize;
        FileStream fs = new FileStream(inputFile, FileMode.Open);
        StreamReader sr = new StreamReader(fs);
        while (!sr.EndOfStream)
        {
            for (int j = 1; j <= pageSize; j++)
            {
                var line = sr.ReadLine();
                lst.Add(line);
            }
            outputFile = destinationFileName + count + baseName + extension;
            CopyLines(lst, outputFile);
            lst.Clear();
            count++;
        }
    }

    private void CopyLines(List<string> line, string outputFile)
    {
        FileStream outputFileStream = new FileStream(outputFile, FileMode.Create, FileAccess.Write);
        //StreamWriter writer = new StreamWriter(outputFile);
        //for (int i = 1; i < line.Count; i++)
        //{
        //}
        using (StreamWriter sw = new StreamWriter(outputFileStream))
        {
            foreach (var li in line)
            {
                sw.WriteLine(li);
            }
        }
    }

由于

1 个答案:

答案 0 :(得分:1)

您正在迭代整个集合两次。如果您在阅读时写入输出文件,那么将在整个集合中保存一次迭代。

    while (!sr.EndOfStream)
    {
        outputFile = destinationFileName + count + baseName + extension;
        FileStream outputFileStream = new FileStream(outputFile, FileMode.Create, FileAccess.Write);

        using (StreamWriter sw = new StreamWriter(outputFileStream))
        {
            for (int j = 1; j <= pageSize; j++)
            {
                var line = sr.ReadLine();
                sw.WriteLine(li);
            }
        }
        lst.Clear();
        count++;
    }