【问题标题】:How to read a file line by line remotely in .NET?如何在.NET中远程逐行读取文件?
【发布时间】:2023-04-03 13:12:01
【问题描述】:

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

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

【问题讨论】:

  • 您的意思是不将文件下载到您正在运行的任何系统上?只是将文件的内容保存在内存中,而不保存?
  • @JosephRT 是的,这就是我的观点

标签: c# .net file io remote-access


【解决方案1】:

最终,您需要将整个文件下载到本地计算机。没有办法解决这个问题。但是在开始处理数据之前,您不必等待一直读取整个文件到结束:

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
    }
}

但我也会寻找一个专用的 CSV 解析器,它可以接受 Stream 作为构造函数输入。如果您打算只使用 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(','));

(我不赞成用逗号分隔...这只是一个简单的例子)。

【讨论】:

  • 谢谢,这是一个很好的答案!实际上,在这种情况下,它并不是专门针对 csv 文件的。
  • 是否可以使用 Reactive Observable 异步读取行,以便像某种异步流一样拥有一种异步 IEnumerable?
猜你喜欢
  • 2014-11-14
  • 1970-01-01
  • 2014-04-10
  • 2011-11-02
  • 2020-01-29
  • 2019-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多