如何读取文本文件中的指定行?

ank*_*shg 53 c# string file-io input

给定一个文本文件,我将如何读取文件中的任意行?

说,我有一个文件test.txt.我如何阅读文件中的第15行?

我所看到的是涉及将整个文本文件存储为String数组然后使用行号的值作为要从数组中使用的String的数量的东西......但是有一些复杂情况:文本文件是巨大的,我正在编写的应用程序的机器并不是一个顶尖的系统.速度不是首要任务,但绝对是一个主要问题.

有没有办法读取文本文件的特定行并将结果存储为字符串?

感谢您的回复:该文件是KINDA结构化的.它有25行信息,然后X号线,但第25行17具有的价值X.

但是,有一个空白行,它作为文件中的第二条记录重复自身,X可以为每条记录赋予不同的值.

我想要做的是读取并存储前25行作为独立值,然后将下一个X(通常约250)行存储为数组.然后我将它存储在SQL数据库中并重复使用NEXT记录,直到我到达第Y条记录(文件中的记录数在第3行)

编辑2:好吧,我想我已经找到了基于你所有人的回应的解决方案.

我将读取前25行并将其存储为数组.我将数组的相关内容复制到局部变量然后我将删除前25行.然后,我可以使用info将下一个X行(数组中的第13项的值)存储为数组,将其序列化,将其存储在数据库中,然后删除我刚刚读取的行.

然后,我可以为每个后续记录重复该过程.

当然,这取决于我正在做的一个假设,说实话,我不确定是否属实.是否有可能从C#中删除文本文件中的前n行而不必读取整个内容并在没有前n行的情况下重写它?

Meh*_*ari 97

.NET 4.0编辑

从.NET 4.0开始,可以直接访问文件的单行.例如,访问第15行:

string line = File.ReadLines(FileName).Skip(14).Take(1).First();
Run Code Online (Sandbox Code Playgroud)

这将仅返回所需的行


既然你无法预测文件中第i行的位置(可以吗?),那么你也必须阅读所有以前的行.如果行号很小,这可能比ReadAllLines方法更有效.

string GetLine(string fileName, int line)
{
   using (var sr = new StreamReader(fileName)) {
       for (int i = 1; i < line; i++)
          sr.ReadLine();
       return sr.ReadLine();
   }
}
Run Code Online (Sandbox Code Playgroud)

  • 不一定是固定的,如果它是*可预测的*也可以. (6认同)
  • 除非您的文本文件具有固定的行长度. (3认同)
  • @Merhdad:UTF16不是固定长度的,但它的前身是UCS-2(我最近才知道这个差异).见http://en.wikipedia.org/wiki/UTF-16/UCS-2 (3认同)
  • 旁注:如果您只想读取单行,`ElementAt(OrDefault)` 更合适:`string line = File.ReadLines(FileName).ElementAtOrDefault(14);` (2认同)

Dav*_*wns 12

如果每一行都是固定长度,那么你可以在它周围打开一个Stream,在文件中寻找(每行字节数)*n并从那里读取你的行.

using( Stream stream = File.Open(fileName, FileMode.Open) )
{
    stream.Seek(bytesPerLine * (myLine - 1), SeekOrigin.Begin);
    using( StreamReader reader = new StreamReader(stream) )
    {
        string line = reader.ReadLine();
    }
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用StreamReader读取行,直到找到所需的行.这种方式比较慢,但仍然比阅读每一行都有所改进.

using( Stream stream = File.Open(fileName, FileMode.Open) )
{
    using( StreamReader reader = new StreamReader(fileStream) )
    {
        string line = null;
        for( int i = 0; i < myLineNumber; ++i )
        {
            line = reader.ReadLine();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Jar*_*Par 5

不,不幸的是没有。在原始级别文件不能在行号的基础上工作。相反,它们在位置/偏移基础上工作。根文件系统没有行的概念。它是由更高级别的组件添加的概念。

所以没有办法告诉操作系统,请在 blah 处打开文件。相反,您必须打开文件并跳过计算新行,直到您通过指定的数字。然后将下一组字节存储到数组中,直到遇到下一个新行。