我正在尝试读取文件,但我需要控制文件中的行号。我尝试使用StreamReader.ReadLine方法,但我无法控制行号。
这是我的代码:
private void abrirToolStripMenuItem_Click(object sender, EventArgs e)
{
string line;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
StreamReader sr = new
StreamReader(openFileDialog1.FileName);
//Read specified line with StreamReader
sr.Close();
}
}
它的形式,设计是西班牙语。
请有人可以帮帮我吗?
你可以使用返回File.ReadLines()
的IEnumerable<string>
。然后,您可以使用LINQ的Skip()
和FirstOrDefault()
方法跳过所需的行数,并获取第一项(如果没有更多项,则返回null):
line = File.ReadLines().Skip(lineNumber - 1).FirstOrDefault()
Jeppe评论说这也可以写成:
line = File.ReadLines().ElementAtOrDefault(lineNumber - 1);
我使用lineNumber - 1
因为它是跳过线,所以你想为第1行指定Skip(0)
。
如前所述,如果该行不超出文件末尾,则会将line
设置为null
。
如果你必须使用StreamReader
,那么你所能做的就是在循环中调用ReadLine()
,直到你得到你想要的行号或文件的结尾:
line = null;
for (int i = 0; i < lineNumber; ++i)
{
if ((line = sr.ReadLine()) == null)
{
break; // end of file reached
}
}
StreamReader.ReadLine方法允许您逐行读取,这将避免将整个文件加载到内存中,这可能是大文件的问题。
Readline在到达文件末尾时将返回null,因此使用内部计数器对其进行while循环测试将逐行读取,直到找到所需的行或EOF。
private void abrirToolStripMenuItem_Click(object sender, EventArgs e)
{
const int specifiedLine = 32;
string line;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
line = GetSpecifiedLine(openFileDialog1.FileName, specifiedLine);
}
}
private string GetSpecifiedLine(string fileName, int specifiedLine)
{
int lineCount = 0;
using (StreamReader sr = new StreamReader(fileName))
{
lineCount++;
var line = sr.ReadLine();
while (line != null)
{
if (lineCount == specifiedLine)
{
return line;
}
line = sr.ReadLine();
}
return null;
}
}
您可以尝试使用此方法:将文件读取到数组,然后您可以轻松有效地控制文件中的行号。
string output = "";
string[] lines = File.ReadAllLines(String.Concat(@textBox1.Text, "\\temp\\test.txt"));
for (int i = 0; i < lines.Length; i++)
{
if (lines[i].Contains("Binh"))
{
output = lines[i - 1];
}
}