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