2012-06-24 249 views
1

我有一个文本很大的文件,我想把它分成更小的文件。如何将大文本文件分割成更小的文件?

在这个例子中,我做什么:

  1. 我打开一个文本文件,让我们有10万行说成是
  2. 我设置了一些包= 300这里,这意味着,这就是小文件的限制,一旦一个小文件有300行,关闭它,打开一个新的文件,例如写入(package2)。

  3. 同样,在步骤2

  4. 你已经知道

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

让我告诉你我说的:

 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'已用于'父级或当前'范围内用于表示其他内容

+0

好了,对不起,那:) – user1461166

+0

嗯你有什么问题吗?代码已经在那里。 – usr

回答

0

这段代码看起来像是关闭了流,并且当你点击300行时重新打开一个新流。这段代码究竟做了些什么?

如果您没有300行的偶数倍数,您希望添加的一件事是最后关闭(可能带有检查,因此它不会尝试关闭已关闭的流)。

编辑:

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

StreamWriter pak = new StreamWriter(package + "Pack-" + packnr + "+_" + date2 + ".txt"); 

成为

pak = new StreamWriter(package + "Pack-" + packnr + "+_" + date2 + ".txt"); 
+0

编辑该职位:) – user1461166

+0

也编辑了我的。 :) – BlargleMonster

+0

感谢哥们:)它的工作,并明确:) – user1461166

0

Logrotate可以自动为你做到这一点。已经投入了多年的时间,人们信任它们处理他们有时非常大的网络服务器日志。

0

请注意,由于您定义了多个变量pak,编写的代码将无法编译。否则它应该起作用,尽管它有一些改进的空间。

使用文件时,我的建议和一般标准是包装你的代码在using块,基本上是建立在一个finally从句的顶部语法糖:

using (var stream = File.Open("C:\hi.txt")) 
{ 
    //write your code here. When this block is exited, stream will be disposed. 
} 

相当于:

try 
{ 
    var stream = File.Open(@"C:\hi.txt"); 
} 
finally 
{ 
    stream.Dispose(); 
} 

此外,在处理文件时,始终更愿意使用非常特定的权限和模式打开文件流,而不是使用假设有某些默认选项的更稀疏的构造函数。例如:

var stream = new StreamWriter(File.Open(@"c:\hi.txt", FileMode.CreateNew, FileAccess.ReadWrite, FileShare.Read)); 

这将保证,例如,文件应该被改写 - 相反,我们认为我们要打开不存在的文件。

哦,而不是使用您执行的检查,我建议使用StreamReader对象的EndOfStream属性。

+0

感谢您的帮助:) – user1461166

3

试试这个:

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); 
} 
相关问题