C# 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
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线,所以没有任何工作,我在代码中有逻辑错误。多亏了你,我才克服了那个索引错误。非常感谢你: