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)
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)
不,不幸的是没有。在原始级别文件不能在行号的基础上工作。相反,它们在位置/偏移基础上工作。根文件系统没有行的概念。它是由更高级别的组件添加的概念。
所以没有办法告诉操作系统,请在 blah 处打开文件。相反,您必须打开文件并跳过计算新行,直到您通过指定的数字。然后将下一组字节存储到数组中,直到遇到下一个新行。
归档时间: |
|
查看次数: |
199215 次 |
最近记录: |