2012-06-24 241 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); 
} 
相關問題