Как читать файл построчно в .NET? - PullRequest
0 голосов
/ 19 октября 2018

Допустим, у меня есть файл, расположенный по заданному URL-адресу (и нет никакой возможности что-либо делать на сервере, на котором размещен этот файл).

Может ли клиентское приложение .NET читать его построчно, не загружаяфайл целиком?Если да, то как?

1 Ответ

0 голосов
/ 19 октября 2018

В конечном счете, вам нужно выгрузить весь файл на локальный компьютер.Там нет никакого способа обойти это.Но вам не нужно ждать, чтобы прочитать весь файл до конца, прежде чем начинать обрабатывать данные в начале:

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(','));

(Не то чтобы я одобряюразделение на запятую ... это только быстрый пример).

...