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

C# C将文件行存储到数组中,然后保存所选行,c#,arrays,file,C#,Arrays,File,我试图编写代码,基本上打开所需的文件,将所有行存储到数组中,然后,若该行满足条件,该行将保存到新的文本文件中。当运行程序时,我将错误消息发送给行读取器,该索引位于数组之外。请帮忙,我是C的新手 int NumLines = new StreamReader(OpenFile.FileName).ReadToEnd().Split(new char[] { '\n' }).Length; StreamReader Data = new StreamReader(OpenF

我试图编写代码,基本上打开所需的文件,将所有行存储到数组中,然后,若该行满足条件,该行将保存到新的文本文件中。当运行程序时,我将错误消息发送给行读取器,该索引位于数组之外。请帮忙,我是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();

索引应小于数组大小:

for (int i = 0; i < NumLines; i++)
                  ^
其中条件是检查是否应写入行的委托。例如,如果您只想写以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;
        }
    }
}

索引应小于数组大小:

for (int i = 0; i < NumLines; i++)
                  ^
其中条件是检查是否应写入行的委托。例如,如果您只想写以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;
        }
    }
}
试着这样做:

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);
然后,如果需要将此文件的所有行与行中的某些行进行比较,可以这样做:

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);
试着这样做:

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);
然后,如果需要将此文件的所有行与行中的某些行进行比较,可以这样做:

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

你的代码可能会被简化成这样

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

你的代码可能会被简化成这样

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

您可能不会读取同一文件两次。。。但是顺便问一下,你为什么要把文件读两遍呢一旦我想找到行数,然后读取它们以找到特定行,您可能不会读取同一文件两次。。。但是顺便问一下,你为什么要把文件读两遍呢有一次,我想找出行数,然后阅读它们以找到具体的行数lines@TomasMichalek所以您想在源文件中找到线顶点,然后在输出中写入三行:顶点和源文件中带+6和+8索引的两行?谢谢。但我希望它在数组中,因为我不希望找到特定的行并在下面写一些行。条件示例:`if arr[i]==VERTEX{File.WriteLineVERTEX;File.WriteLinearr[i+6];File.WriteLinearr[i+8];}@TomasMichalek你能回答我的问题吗?就像是或不是:如果“不是”的话,还有一些评论是的,我想要那个,对不起,但我的互联网掉了,我一直在重写帖子。。。外面风雨交加。我要做的是,我想把CAD/CAM的DXF文件重写成坐标,所以如果文件找到例如线顶点,它会写线顶点和坐标,这是6线和8线,所以没有任何工作,我在代码中有逻辑错误。多亏了你,我才克服了那个索引错误。非常感谢:@TomasMichalek so。。您想在源文件中找到线顶点,然后在输出中写入三行:顶点和源文件中带+6和+8索引的两行?谢谢。但我希望它在数组中,因为我不希望找到特定的行并在下面写一些行。条件示例:`if arr[i]==VERTEX{File.WriteLineVERTEX;File.WriteLinearr[i+6];File.WriteLinearr[i+8];}@TomasMichalek你能回答我的问题吗?就像是或不是:如果“不是”的话,还有一些评论是的,我想要那个,对不起,但我的互联网掉了,我一直在重写帖子。。。外面风雨交加。我要做的是,我想把CAD/CAM的DXF文件重写成坐标,所以如果文件找到例如线顶点,它会写线顶点和坐标,这是6线和8线,所以没有任何工作,我在代码中有逻辑错误。多亏了你,我才克服了那个索引错误。非常感谢你: