using Microsoft.Extensions.Logging; using ZstdSharp; namespace MesETL.App.Services.ETL; /// /// 解压ZST文件,从中读取CSV数据 /// public class ZstReader : CsvReader { protected new readonly Lazy Reader; private Stream? _stream; public ZstReader(string filePath, string tableName, string[] headers, string delimiter = ",", char quoteChar = '\"', ILogger? logger = null) : base(filePath, tableName, headers, delimiter, quoteChar, logger) { Reader = new Lazy(() => { _stream = new DecompressionStream(File.OpenRead(filePath)); return new StreamReader(_stream); }, false); } public ZstReader(Stream stream, string tableName, string[] headers, string delimiter = ",", char quoteChar = '\"', ILogger? logger = null) : base(stream, tableName, headers, delimiter, quoteChar, logger) { var ds = new DecompressionStream(stream); Reader = new Lazy(() => new StreamReader(ds), false); } public override async ValueTask ReadAsync() { var str = await Reader.Value.ReadLineAsync(); if (string.IsNullOrWhiteSpace(str)) return false; var fields = ParseRowFaster(str, QuoteChar, Delimiter[0]); Current = new DataRecord(fields, TableName, Headers); return true; } public override void Dispose() { base.Dispose(); if (Reader.IsValueCreated) { Reader.Value.Dispose(); _stream?.Dispose(); } } }