我的网站上有许多大型CSV文件(每个最多100,000行)。从每个CSV文件,我需要读取文件中的最后一行。我知道如何在读取内容之前将文件保存到磁盘上时解决问题:
var url = "http://data.cocorahs.org/cocorahs/export/exportreports.aspx?ReportType=Daily&Format=csv&Date=1/1/2000&Station=UT-UT-24"
var client = new System.Net.WebClient();
var tempFile = System.IO.Path.GetTempFileName();
client.DownloadFile(url, tempFile);
var lastLine = System.IO.File.ReadLines(tempFile).Last();
有没有办法在不保存磁盘上的临时文件的情况下获取最后一行? 我试过了:
using (var stream = client.OpenRead(seriesUrl))
{
using (var reader = new StreamReader(stream))
{
var lastLine = reader.ReadLines("file.txt").Last();
}
}
但StreamReader类没有ReadLines方法......
答案 0 :(得分:2)
StreamReader
没有ReadLines
方法,但它有一个ReadLine
method来读取流中的下一行。您可以使用它来读取远程资源的最后一行,如下所示:
using (var stream = client.OpenRead(seriesUrl))
{
using (var reader = new StreamReader(stream))
{
string lastLine;
while ((lastLine = reader.ReadLine()) != null)
{
// Do nothing...
}
// lastLine now contains the very last line from reader
}
}
使用ReadLine
一次读取一行将比StreamReader.ReadToEnd
使用更少的内存,full list of predicates and handlers会将整个流作为string
读入内存。对于包含100,000行的CSV文件,这可能会占用大量内存。
答案 1 :(得分:1)
这对我有用,虽然该服务没有返回数据(仅限CSV标题):
public void TestMethod1()
{
var url = "http://data.cocorahs.org/cocorahs/export/exportreports.aspx?ReportType=Daily&Format=csv&Date=1/1/2000&Station=UT-UT-24";
var client = new System.Net.WebClient();
using (var stream = client.OpenRead(url))
{
using (var reader = new StreamReader(stream))
{
var str = reader.ReadToEnd().Split('\n').Where(x => !string.IsNullOrEmpty(x)).LastOrDefault();
Debug.WriteLine(str);
Assert.IsNotEmpty(str);
}
}
}