C#将文件行存储到数组中,然后保存选定的行

时间:2017-04-12 22:02:02

标签: c# arrays file

我正在尝试制作代码,基本上会打开所需的文件,将所有行存储到数组中,然后,如果行符合条件,则行将保存到新的文本文件中。运行程序时,我收到错误消息给行读者,该索引在数组之外。请帮忙,我是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();

3 个答案:

答案 0 :(得分:3)

索引应小于数组大小:

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

但是你不需要将行放入数组以便将它们写入其他文件。例如。如果你想按条件只写一些行:

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

其中 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));

答案 1 :(得分: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);

答案 2 :(得分:0)

您的代码可以通过这种方式缩短...

   /// 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
      }
   }