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