我遇到的问题是我有一个充满记录的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();
}
}
}
答案 0 :(得分:1)
完全删除列表:
var fileStream = ...
var gzipStream = new GZipStream(fileStream, CompressionMode.Decompress);
var memoryStream = new MemoryStream();
gzipStream.CopyTo(memoryStream);
// call Parse on memorystream
您可以在代码中的适当位置添加using
块。