首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将一个大文本文件拆分为较小的文件?

如何将一个大文本文件拆分为较小的文件?
EN

Stack Overflow用户
提问于 2012-06-24 12:40:35
回答 4查看 3.2K关注 0票数 1

我有一个包含一些文本的大文件,我想把它分割成更小的文件。

在这个例子中,我所做的是:

  1. 我打开一个文本文件,比方说,里面有10,000行
  2. 我在这里设置了一些package=300,这意味着,这是一个小文件限制,一旦一个小文件有300行,关闭它,打开一个新的文件,例如,编写(package2)。
  3. 和第二步一样。
  4. 你已经知道了

下面是我函数中应该这样做的代码。ideea (我不知道的是)是如何关闭,并打开一个新的文件,一旦它已经达到300限制(在我们这里的例子)。

让我告诉你我在说什么:

代码语言:javascript
复制
        int nr = 1;
        package=textBox1.Text;//how many lines/file (small file)
        string packnr = nr.ToString();
        string filer=package+"Pack-"+packnr+"+_"+date2+".txt";//name of small file/s
        int packtester = 0;
        int package= 300;
        StreamReader freader = new StreamReader("bigfile.txt");
        StreamWriter pak = new StreamWriter(filer);
        while ((line = freader.ReadLine()) != null)
        {
            if (packtester < package)
            {
                pak.WriteLine(line);//writing line to small file
                packtester++;//increasing the lines of small file
            }
            else if (packtester == package)//in this example, checking if the lines 
                                           //written, got to 300 
            {
                packtester = 0;
                pak.Close();//closing the file
                nr++;//nr++ -> just for file name to be Pack-2;
                packnr = nr.ToString();   
                StreamWriter pak = new StreamWriter(package + "Pack-" + packnr + "+_" + date2 + ".txt");
            }
        }

我知道这些错误:

不能在声明局部变量'pak‘之前使用它

不能在此范围内声明名为“pak”的局部变量,因为它将赋予“pak”一个不同的含义,而pak已经在“父或当前”作用域中用于表示其他内容。

EN

回答 4

Stack Overflow用户

发布于 2012-06-24 13:05:49

试试这个:

代码语言:javascript
复制
public void SplitFile()
{
    int nr = 1;
    int package = 300;
    DateTime date2 = DateTime.Now;
    int packtester = 0;
    using (var freader = new StreamReader("bigfile.txt"))
    {
        StreamWriter pak = null;
        try
        {
            pak = new StreamWriter(GetPackFilename(package, nr, date2), false);
            string line;

            while ((line = freader.ReadLine()) != null)
            {
                if (packtester < package)
                {
                    pak.WriteLine(line); //writing line to small file
                    packtester++; //increasing the lines of small file
                }
                else
                {
                    pak.Flush();
                    pak.Close(); //closing the file
                    packtester = 0;
                    nr++; //nr++ -> just for file name to be Pack-2;
                    pak = new StreamWriter(GetPackFilename(package, nr, date2), false);
                }
            }
        }
        finally
        {
            if(pak != null)
            {
                pak.Dispose();
            }
        }
    }
}

private string GetPackFilename(int package, int nr, DateTime date2)
{
    return string.Format("{0}Pack-{1}+_{2}.txt", package, nr, date2);
}
票数 4
EN

Stack Overflow用户

发布于 2012-06-24 12:49:49

这段代码看起来像是关闭了流,当你点击300行时重新打开一个新的流。在这段代码中,到底什么东西不起作用?

您需要添加的一件事是最后一次关闭(可能需要检查,这样它就不会试图关闭已经关闭的流),以防您没有300行的偶数。

编辑:

由于你的编辑,我看到了你的问题。您不需要在最后一行代码中重新声明pak,只需将其重新初始化到另一个流编写器。(我不记得那是否是一次性的,但如果是的话,你可能应该在做新的之前这样做)。

代码语言:javascript
复制
StreamWriter pak = new StreamWriter(package + "Pack-" + packnr + "+_" + date2 + ".txt");

变成了

代码语言:javascript
复制
pak = new StreamWriter(package + "Pack-" + packnr + "+_" + date2 + ".txt");
票数 0
EN

Stack Overflow用户

发布于 2012-06-24 12:55:49

对数旋转可以自动为您完成此操作。它已经投入了很多年,人们信任它来处理他们有时非常大的very服务器日志。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11177489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档