如何在C#中读取文件的特定行

问题描述 投票:1回答:3

我正在尝试读取文件,但我需要控制文件中的行号。我尝试使用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();
        }

    }

它的形式,设计是西班牙语。

请有人可以帮帮我吗?

c# forms streamreader
3个回答
4
投票

你可以使用返回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
    }
}

0
投票

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

0
投票

您可以尝试使用此方法:将文件读取到数组,然后您可以轻松有效地控制文件中的行号。

        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];
            }
        }
© www.soinside.com 2019 - 2024. All rights reserved.