我的问题是我有一个充满记录的CSV文件,该文件当前正在通过开源CsvHelper.CsvReader.GetRecords<T>
方法映射到强类型集合。它被传递了一个基于GZIP的流,FileStream
该流是从磁盘读取流的。
我怀疑CsvHelper
该类与a一起使用时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();
}
}
}
完全跳过列表:
var fileStream = ...
var gzipStream = new GZipStream(fileStream, CompressionMode.Decompress);
var memoryStream = new MemoryStream();
gzipStream.CopyTo(memoryStream);
// call Parse on memorystream
随意using
在代码中的适当位置添加块。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句