使用C#读取大文本文件的最后一个符号或行的最有效方法是什么?
答案 0 :(得分:4)
如果文件不是太大,只需读取行并选择最后一行:
string lastLine = File.ReadLines("pathToFile").LastOrDefault(); // if the file is empty
所以你以这种方式获得最后一个角色:
Char lastChar = '\0';
if(lastLine != null) lastChar = lastLine.LastOrDefault();
File.ReadLines
在开始处理之前不需要读取所有行,因此在内存消耗方面它很便宜。
这是J. Skeet的更复杂的方式:How to read a text file reversely with iterator in C#
答案 1 :(得分:3)
假设您的文本文件是ASCII,此方法将允许您直接跳到最后一个字符并避免读取文件的其余部分(就像到目前为止给出的所有其他答案一样)。
using (FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read))
{
stream.Seek(-1, SeekOrigin.End);
byte b = (byte)stream.ReadByte();
char c = (char)b;
}
如果您的程序需要处理多字节编码,则可能需要执行一些复杂的逻辑,如Skeet's answer所示。但是,鉴于您的案例仅限于阅读最后一个字符,您可以实现特定于您预期编码的简化版本。下面的代码适用于UTF-8(这是目前最流行的编码)。 Seek
可能会将您的读者置于前一个字符的中间,但解码器将在读取最后一个字符时从中恢复。
FileInfo fileInfo = new FileInfo(path);
int maxBytesPerChar = Encoding.UTF8.GetMaxByteCount(1);
int readLength = Math.Min(maxBytesPerChar, (int)fileInfo.Length);
using (StreamReader reader = new StreamReader(path, Encoding.UTF8))
{
reader.DiscardBufferedData();
reader.BaseStream.Seek(-readLength, SeekOrigin.End);
string s = reader.ReadToEnd();
char c = s.Last();
}
答案 2 :(得分:0)
string s = File.ReadAllText("test.txt");
string[] split = s.Split(s[s.Length - 1]);
和最后一行: -
var lastLine = File.ReadLines("test.txt").Last();
答案 3 :(得分:0)
using System;
using System.IO;
class Test
{
public static void Main()
{
try
{
using (StreamReader sr = new StreamReader("TestFile.txt"))
{
String line = sr.ReadToEnd();
Console.WriteLine(line[line.length-1);
}
}
catch (Exception e)
{
Console.WriteLine("The file could not be read:");
Console.WriteLine(e.Message);
}
}
}
答案 4 :(得分:0)
我建议使用File-Class的ReadToEnd-Method,因此您无需关闭Steam / TextReader:
string s = File.ReadAllText(@"YOUR PATH HERE");
char lastchar = s[s.Length - 1];
答案 5 :(得分:-1)