提供给读取的LINQtoCSV流是空的,或者不支持搜索

时间:2012-10-27 21:19:08

标签: c# .net csv

我正在尝试使用LINQtoCSV将CSV文件解析为对象列表,并且收到错误“提供给读取的流为空,或者不支持搜索。”

错误发生在foreach(StockQuote sq in stockQuotesStream)

以下是抛出错误的方法。 .CSV文件正在从Internet下载,并且永远不会存储到磁盘(仅存储到StreamReader)。

    public List<StockQuote> CreateStockQuotes(string symbol)
    {
        List<StockQuote> stockQuotes = new List<StockQuote>();

        CsvFileDescription inputFileDescription = new CsvFileDescription
        {
            SeparatorChar = ',',
            FirstLineHasColumnNames = false
        };

        CsvContext cc = new CsvContext();

        IEnumerable<StockQuote> stockQuotesStream = cc.Read<StockQuote>(GetCsvData(symbol));

        foreach (StockQuote sq in stockQuotesStream)
        {
            stockQuotes.Add(sq);
        }

        return stockQuotes;
    }

2 个答案:

答案 0 :(得分:2)

  

.CSV文件正在从互联网上下载,永远不会存储到磁盘上(仅存储到StreamReader)。

大概这是问题所在。你不清楚这是什么意思,因为如果你在它周围包裹了一个StreamReader,这对于基础流来说是一种痛苦 - 但你通常不会寻求从网上下载的流,听起来你正在使用的代码需要一个可搜索的流。

一个简单的选择是将整个流下载到MemoryStream(如果您使用的是.NET 4,则使用Stream.CopyTo),然后回滚MemoryStream(设置Position }到0)并将 传递给Read方法。

答案 1 :(得分:1)

首先使用MemoryStream然后使用StreamReader就是答案,但我对它的看法与提到的有点不同。

        WebClient client = new WebClient();

        using (MemoryStream download = new MemoryStream(client.DownloadData(url)))
        {
            using (StreamReader dataReader = new StreamReader(download, System.Text.Encoding.Default, true))
            {
                return dataReader;
            }
        }
相关问题