如何在C#中从字符串中获取特定行?

11

我在 C# 中有一个字符串,想要获取特定行的文本,比如第 65 行。如果文件中没有那么多行,我希望得到一个空字符串。如何实现?

7个回答

20

假设 \r\n 或 \n 是您的换行符序列,则快速简便。

string GetLine(string text, int lineNo)
{
  string[] lines = text.Replace("\r","").Split('\n');
  return lines.Length >= lineNo ? lines[lineNo-1] : null;
}

使用 Environment.Newline 怎么样? - Dan Diplo
2
String.Split() 只接受 char 参数,如果你传入 Environment.NewLine.ToCharArray(),那么在 Windows 系统下每隔一行就会有一个空字符串(在 Unix 下完全没问题)。 - EventHorizon
2
StringSplitOptions.RemoveEmptyEntries - H H
@Henk:你说得没错 - 除非原始文本中有空行?我还停留在.NET 2.0,没有这样花哨的选项 :-) 谢谢你提供的信息。 - EventHorizon
FYI,我的做法是执行text.Replace("\n\r","\n").Replace("\r\n", "\n").Split('\n') - Icemanind

8
private static string ReadLine(string text, int lineNumber)
{
    var reader = new StringReader(text);

    string line;
    int currentLineNumber = 0;

    do
    {
        currentLineNumber += 1;
        line = reader.ReadLine();
    }
    while (line != null && currentLineNumber < lineNumber);

    return (currentLineNumber == lineNumber) ? line :
                                               string.Empty;
}

这是最优化的函数。如果你想要一个基于0的索引,只需将currentLineNumber初始化为-1而不是0。 - A.Baudouin

4
你可以使用System.IO.StringReader读取你的字符串,然后使用ReadLine()方法直到你找到想要的行或者字符串已经用完为止。
由于每一行的长度可能不同,所以没有快捷方式可以直接跳转到第65行。
当你使用Split()方法分割一个字符串时,会复制一份相同的字符串,这将使内存消耗翻倍。

2
如果您已经有一个字符串实例,可以使用String.Split来分割每一行,并检查第65行是否可用,如果可用,则使用它。如果内容在文件中,请使用File.ReadAllLines获取字符串数组,然后执行前面提到的相同检查。这对于小文件效果很好,如果您的文件很大,请考虑逐行读取。
using (var reader = new StreamReader(File.OpenRead("example.txt")))
{
    reader.ReadLine();
}

2
你可以根据换行符将字符串分割为多个部分。
string[] strLines = yourString.split(Environment.NewLine);
if(strLines.Length > lineNumber)
{
    return strLines[lineNumber];
}

这个不行,我们无法将字符串转换为char[]。 - savi

1

theString.Split("\n".ToCharArray())[64]


它将返回65行,并且在Environment.NewLine为"\r\n"(Windows)的环境中,你将在所有返回的行开头得到'\r'。 - EventHorizon
是的,我对那个答案很快。总体思路是可行的。但是,当涉及到数千行的字符串时,它有点慢。 至于换行符,这取决于字符串的来源。如果只使用 \n 而没有 \r 编写,则不起作用。字符串的格式不取决于环境,对吧? 在这种情况下,正则表达式可以完成工作,但速度较慢。 - Alex

0

除了利用特定文件结构和较低级别的文件操作之外,我认为没有比读取64行、丢弃它们,然后读取第65行并保留它更快的方法了。在每个步骤中,您可以轻松地检查是否已读取整个文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接