Как читать csv файл с URL-адреса?

Я пытаюсь создать веб-службу, которая попадает к URL-адресу, например. www.domain.co.uk/prices.csv, а затем читает файл csv. Это возможно и как? В идеале без загрузки файла csv?

Ответ 1

Вы можете использовать:

public string GetCSV(string url)
{
    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
    HttpWebResponse resp = (HttpWebResponse)req.GetResponse();

    StreamReader sr = new StreamReader(resp.GetResponseStream());
    string results = sr.ReadToEnd();
    sr.Close();

    return results;
} 

И затем разделить его:

public static void SplitCSV()
{
    List<string> splitted = new List<string>();
    string fileList = getCSV("http://www.google.com");
    string[] tempStr;

    tempStr = fileList.Split(',');

    foreach (string item in tempStr)
    {
        if (!string.IsNullOrWhiteSpace(item))
        {
            splitted.Add(item);
        }
    }
}

Хотя есть много парсеров CSV, и я бы посоветовал не сворачивать ваши собственные. FileHelpers является хорошим.

Ответ 2

Вам необходимо загрузить файл, чтобы прочитать его. Это не похоже на то, что ваш код может каким-то образом очищать содержимое удаленно, не загружая их.

Но вам не нужно сохранять его в файл, если вы имеете в виду это. Вы можете использовать класс WebClient в качестве удобства для извлечения ресурсов через HTTP. В частности, вы можете посмотреть метод DownloadString.

Ответ 3

// Download the file to a specified path. Using the WebClient class we can download 
// files directly from a provided url, like in this case.

System.Net.WebClient client = new WebClient();
client.DownloadFile(url, csvPath);

Где URL-адрес вашего сайта с файлом csv, а csvPath - это то место, куда вы хотите, чтобы фактический файл находился.

Ответ 4

В вашей веб-службе вы можете использовать класс WebClient для загрузки файла, что-то вроде этого (я не обрабатывал обработку исключений, а не любые вызовы с использованием или Close/Dispose, просто хотел дать идею, которую вы можете использовать и уточнять/улучшить...)

using System.Net;

WebClient webClient = new WebClient();
webClient.DownloadFile("http://www.domain.co.uk/prices.csv");

то вы можете делать все, что вам нравится, после того, как содержимое файла будет доступно в потоке выполнения вашей службы.

если вы должны вернуть его клиенту в качестве возвращаемого значения вызова веб-службы, вы можете либо вернуть DataSet, либо любую другую структуру данных, которую вы предпочитаете.

Ответ 5

Sebastien Lorion CSV Reader имеет конструктор, который принимает поток.

Если вы решили использовать это, ваш пример станет следующим:

void GetCSVFromRemoteUrl(string url)
{
    HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest
    HttpWebResponse response = request.GetResponse() as HttpWebResponse;

    using (CsvReader csvReader = new CsvReader(response.GetResponseStream(), true))
    {
        int fieldCount = csvReader.FieldCount;
        string[] headers = csvReader.GetFieldHeaders();

        while (csvReader.ReadNextRecord())
        {
            //Do work with CSV file data here
        }
    }

}

когда-либо популярный FileHelpers также позволяет вам читать непосредственно из потока.

Ответ 6

В документации для WebRequest приведен пример использования потоков. Использование потока позволяет анализировать документ без сохранения его в памяти