将List <string>转换为流

时间:2018-01-23 16:07:58

标签: c#

我遇到的问题是我有一个充满记录的CSV文件,目前正通过开源CsvHelper.CsvReader.GetRecords<T>方法映射到强类型集合。它传递了一个GZIP流,它建立在FileStream上,所以从磁盘读取流。

我怀疑CsvHelper类与FileStream一起使用时效率不高,因为此负载需要很长时间。我想首先尝试将原始文件高效地加载到内存中,然后再进行强类型映射。

不幸的是,映射类CsvHelper.CsvReader.GetRecords<T>只接受一个流。我已经设法将原始数据加载到List<string>非常快,但我现在无法弄清楚如何“流化”这个以传递给映射器。这是我可以做的还是有另一种解决方案?

到目前为止,我的代码是

var fileStream = ...
var gzipStream = new GZipStream(fileStream, CompressionMode.Decompress);
var entries = new List<string>();
using (var unzip = new StreamReader(gzipStream))
    while(!unzip.EndOfStream)
         entries.Add(unzip.ReadLine());

Parse(??);

        public IReadOnlyCollection<TRow> Parse(Stream stream)
        {
            Func<Stream> streamFactory = () => stream;
            var results = ParseCsvWithConfig <TRow>(streamFactory, _configuration).AsReadOnly();
       }

 public static IEnumerable<T> ParseCsvWithConfig<T>(Func<Stream> streamFactory, CsvConfiguration configuration)
        {
            using (var stream = streamFactory())
            {
                var streamReader = new StreamReader(stream);
                using (var csvReader = new CsvReader(streamReader, configuration ?? new CsvConfiguration()))
                {
                    return csvReader.GetRecords<T>().ToList();
                }
            }
        }

1 个答案:

答案 0 :(得分:1)

完全删除列表:

var fileStream = ...
var gzipStream = new GZipStream(fileStream, CompressionMode.Decompress);
var memoryStream = new MemoryStream();

gzipStream.CopyTo(memoryStream);

// call Parse on memorystream

您可以在代码中的适当位置添加using块。