如何在 .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(','));
(并不是说我支持用逗号分隔...这只是一个简单的例子)。
假设我有一个位于给定 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(','));
(并不是说我支持用逗号分隔...这只是一个简单的例子)。