MES-ETL/MesETL.App/Services/ETL/ZstReader.cs

53 lines
1.6 KiB
C#
Raw Normal View History

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