2011-11-21 102 views
1

我有一個大的文本文件(如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; 
     } 

    } 
} 
+0

當您運行此您能得到什麼? – harpo

+0

作爲參考,您的'使用(StreamWriter sw ...)'應該在'使用(StreamReader sr ...)'之外 –

+0

在StreamReader的開頭,之後或之前創建StreamWriter。 – kol

回答

1

有幾個問題:

  1. 你並不需要增加索引 - 永遠只是寫指數爲零。
  2. 您正在爲每個塊重新創建StreamWriter。
  3. 你可能會寫出了錯誤的字符數(你不檢查你有多少閱讀,其中,在文件的最後,可能小於40)

嘗試以下操作:

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); 
       } 
      } 
     } 
    } 
1

您正在爲每個ReadBlock創建一個新的StreamWriter。 (我不知道new StreamWriter(@"filename")的行爲,但我會打賭這不是你想要發生的)。此外,ReadBlockindex參數是目標數組的索引,而不是文件的索引。因此,每次閱讀都應該爲0。您不需要考慮文件中的位置,因爲您按照順序從一個流向另一個流。 StreamReader/Writer將相應地移動底層的流。

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

這仍然有一些其他問題...它將在每個塊之間放置2個換行符,並且可能在文件末尾寫入垃圾... –

+0

Sorted。謝謝里德。 – spender

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(); 
     } 
    } 
} 
相關問題