从网站上读取最后一行而不保存磁盘上的文件

时间:2017-07-07 18:35:54

标签: c# csv io webclient streamreader

我的网站上有许多大型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方法......

2 个答案:

答案 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);
        }
    }

}