如何在 .NET 中远程逐行读取文件?

How to read a file line by line remotely in .NET?

假设我有一个位于给定 url 上的文件(并且不可能在托管该文件的服务器上执行任何操作)。

.NET 客户端应用程序是否可以在不完全下载文件的情况下逐行读取它?如果是,怎么做?

最终,您需要将整个文件下载到本地计算机。没有办法解决这个问题。但是你不用等到把整个文件都读完才开始处理开头的数据:

using (var request = WebRequest.Create("www.example.com/data.csv"))
using (var response = request.GetResponse())
using (var str = response.GetResponseStream())
using (var rdr = new StreamReader(str))
{
    string line;
    while ( (line = rdr.ReadLine()) != null)
    {
       //process each line here
    }
}

但我还会寻找可以接受 Stream 作为构造函数输入的专用 CSV 解析器。如果您打算只使用 string.Split() 或 RegEx 查看数据,那么它们都慢得多并且有很多问题。

我实际上很想将它构建成这样的方法:

public IEnumerable<string> DownloadLines(string URL)
{
    using (var request = WebRequest.Create(URL))
    using (var response = request.GetResponse())
    using (var str = response.GetResponseStream())
    using (var rdr = new StreamReader(str))
    {
        string line;
        while ( (line = rdr.ReadLine()) != null)
        {
            // make sure we yield a *different* variable (defined in the loop) each time
            var result = line;
            yield return result;
        }
    }
}

然后你可以这样称呼它:

foreach(var line in DownloadLines("www.example.com/data.csv"))
{
    //process each line here
}

它也适用于 linq 运算符:

var result = DownloadLines("www.example.com/data.csv").
             Where(l => l.Length > 0).
             Select(l => l.Split(','));

(并不是说我支持用逗号分隔...这只是一个简单的例子)。