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