2

LINQtoCSVを使用してCSVファイルをオブジェクトのリストに解析しようとしていますが、「読み取りに提供されたストリームがnullであるか、シークをサポートしていません」というエラーが表示されます。

エラーはで発生していますforeach(StockQuote sq in stockQuotesStream)

以下は、エラーをスローしているメソッドです。.CSVファイルはインターネットからダウンロードされており、ディスクに保存されることはありません(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ファイルはインターネットからダウンロードされており、ディスクに保存されることはありません(StreamReaderにのみ保存されます)。

おそらくそれが問題です。これが何を意味するのかは明確ではありません。それを包み込んだ場合、StreamReaderそれは基礎となるストリームの観点からは苦痛ですが、通常、ネットからダウンロードされているストリームを探すことはできず、次のように聞こえます。使用しているコードには、シーク可能なストリームが必要です。

簡単なオプションの1つは、ストリーム全体をMemoryStreamStream.CopyTo.NET 4を使用している場合に使用)にダウンロードしてから、MemoryStream(0に設定)を巻き戻してメソッドにPosition渡すことです。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 に答える