2017-04-12 49 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 
     } 
    } 
相关问题