2

我正在尝试使用 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;
    }
4

2 回答 2

4

.CSV 文件是从 Internet 下载的,并且从未存储到磁盘(仅存储到 StreamReader)。

嗯,大概就是这个问题。不太清楚你的意思是什么,如果你把它包裹StreamReader起来,这对于底层流来说是一种痛苦——但你通常不能在从网上下载的流上寻找,这听起来像您正在使用的代码需要一个可搜索的流。

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

于 2012-10-27T21:23:15.880 回答
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;
            }
        }
于 2012-10-27T23:25:43.093 回答