2012-07-24 318 views
21

的最后一行,我需要知道如何读取文本文件的最后一行。我需要找到该行,然后将其处理成一个SQL数据库......我一直在阅读并浏览网页,但是正在努力寻找正确的方法来做到这一点。即:阅读文本文件

  1. 查找文件的最后一行。
  2. 处理文件的最后一行。

我希望这是有道理的。

+1

你尝试过什么?请注意,我们只能提供“1”......“2”完全取决于您。 – 2012-07-24 06:54:50

+0

字节b; fs.Seek(0,SeekOrigin.End); 为(长偏移= 0;偏移 2012-07-24 06:57:56

+0

@DebbieDippenaar非常大的文件,这*可能不是一个坏主意*。就我个人而言,我可能会一次读取* buffers *的字节,并且您将遇到多字节编码的一些主要问题,但是... – 2012-07-24 07:02:20

回答

52

有两种方法:简单和效率低下,或窘况复杂而高效的。复杂的版本假设一个合理的编码。

除非你的文件是这样大,你真的可以读不起这一切,我只是用:

var lastLine = File.ReadLines("file.txt").Last(); 

注意,这里使用File.ReadLinesFile.ReadAllLines。如果您使用.NET 3.5或更早版本你需要使用File.ReadAllLines或编写自己的代码 - ReadAllLines将读取整个文件到内存中一气呵成,而ReadLines流吧。

否则,复杂的方法是使用类似this代码。它试图从文件尾部向后读取,处理诸如UTF-8多字节字符之类的问题。这不愉快。

+0

如果您知道文件的编码,您并不需要处理如果你只是在寻找最后一个有其他字符跟随它的最后一个换行符,那么这很糟糕。例如。U + 000D U + 000A在任何可变长度编码(例如UTF-8或UTF-16)中不会是可变长度的。其后的所有其他内容通常可以被认为是格式良好的。 – Joey 2012-07-24 07:01:46

+0

@Joey:棘手的一点是,如果你向后寻找文件中的任意位置,你需要知道你可能是中间字符。不是UTF-16的问题,但是在UTF-8中,您需要将自己对准角色边界......并且您可以跳到“\ r \ n”的“\ n”中,所以您应该拥有再次倒退。基本上,看看链接答案中的代码。如果你可以写一个更简单的版本,请做,我真的有兴趣看到它。 – 2012-07-24 07:37:32

+0

我必须在这里失去一些东西。 File.ReadLines返回一个System.Collections.Generic.IEnumerable 对象,当我尝试使用它时没有“Last”方法。我的代码是针对.NET 4.0框架的。我是否缺少一些程序集引用或其他内容? – dscarr 2013-06-12 13:29:21

6

我只想结合File.ReadLines(path)Enumerable.Last

String last = File.ReadLines(@"C:\file.txt").Last(); 

它流线和所有不加载到内存中File.ReadAllLines

+0

非常感谢。这给我打开了一点! – 2012-07-24 07:19:32

+0

如何获得文本文件的最后符号? – Neel 2013-10-07 08:10:41

+0

@Neel通过倒退到最后一行,但只有一个字符。 – Max 2017-11-17 05:46:28

7

第一部分:

File.ReadAllLines(@"c:\some\path\file.txt").Last(); 

File.ReadLines(@"c:\some\path\file.txt").Last(); 

readlines方法是首选。

6
string m = ""; 
StreamReader r = new StreamReader("file_path"); 
while (r.EndOfStream == false) 
{ 
    m = r.ReadLine(); 
} 
Console.WriteLine("{0}\n", m); 
r.Close(); 
-3
string last = File.ReadLines(@"C:\file.txt").Last(); 
string lastsymbol = last[last.Count - 1];