2017-04-12 61 views
0

我正在嘗試編碼,基本上會打開所需的文件,將所有行存儲到數組中,然後,如果行確實滿足條件,行將保存到新文本中文件。運行程序時,我收到錯誤消息給線閱讀器,該索引在數組之外。請幫幫忙,我是新來的C#C#將文件行存儲到數組中,然後保存所選行

int NumLines = new StreamReader(OpenFile.FileName).ReadToEnd().Split(new char[] { '\n' }).Length; 
      StreamReader Data = new StreamReader(OpenFile.FileName); 
      string[] arr = new string[NumLines]; 
      for (int i = 0; i <= NumLines; i++) 
      { 
       StreamWriter File = new StreamWriter("C://Users//Tomas//Desktop//BC//tmp//Data.txt"); 
       arr[i] = Data.ReadLine(); 
+0

你可能不讀同一個文件兩次...但你爲什麼要的方式讀取文件的兩倍? :) –

+0

一旦我想找到行數,然後閱讀他們找到特定的行 –

回答

3

指數應小於數組大小:

for (int i = 0; i < NumLines; i++) 
       ^

但你並不需要把線成陣列,以便將它們寫入其他文件。例如。如果你想通過條件只寫幾行:

File.WriteAllLines(newFileName, File.ReadLines(OpenFile.FileName).Where(condition)); 

條件是檢查線路是否應寫入委託。例如。如果你想只寫與"Foo"開始行:

.Where(line => line.StartsWith("Foo")) 

注意:如果你想寫沒有條件的所有行到新的文件,那麼你根本就複製原始文件:

File.Copy(OpenFile.FileName, newFileName); 

更新:從您的意見,很顯然,你需要找到匹配一些條件的行,也寫輸出後第6和第8行輸出。你仍然可以做,沒有傾銷的所有源文件到內存:

private static IEnumerable<string> GetVertexCoordinates(string fileName) 
{ 
    var enumerator = File.ReadLines(fileName).GetEnumerator(); 

    while (enumerator.MoveNext()) 
    { 
     if (enumerator.Current == "VERTEX") 
     { 
      yield return enumerator.Current; 

      for (var i = 0; i < 6; i++) enumerator.MoveNext(); // skip 6 lines 
      yield return enumerator.Current; 

      for (var i = 0; i < 2; i++) enumerator.MoveNext(); // skip 2 more lines 
      yield return enumerator.Current; 
     } 
    } 
} 

和使用仍然是一個班輪

File.WriteAllLines(newFileName, GetVertexCoordinates(OpenFile.FileName)); 
+0

@TomasMichalek所以..你想在源文件中找到行「VERTEX」,然後在輸出中寫入三行:「VERTES」和兩行來自源文件的+6和+8索引? –

+0

謝謝。但我希望它在數組中,因爲我想找到特定的行並在其下寫入一些行。 示例條件: ''if(arr [i] ==「VERTEX」) { File.WriteLine(「VERTEX」); File.WriteLine(arr [i + 6]); File.WriteLine(arr [i + 8]); } –

+0

@TomasMichalek你能回答我的問題嗎?這就像是或不是:)還有一些意見,如果'不' –

1

試試這個方法:

string[] lines = File.ReadAllLines(filepath); 

然後,如果你需要要將此文件的所有行與某條您的行進行比較,您可以這樣做:

string targetFilePath = "C://Users//Tomas//Desktop//BC//tmp//Data.txt"; 
string specificLine = "line, which you try to find"; 
foreach (var line in lines) 
    if (line.Equals(specificLine)) 
     File.WriteAllText(targetFilePath, line); 
0

你的代碼可以shortcutted這樣...

/// Disposal of your reader when unused is essential to close your file 
    using(var reader = new StreamReader(OpenFile.FileName)) 
    { 
     var lines = reader.ReadToEnd().Split(new char[] { '\n' }); 
     int NumLines = lines.Length; 
     for (int i = 0; i < NumLines; i++) 
     { 
      ... do something here 
     } 
    }