2024-01-29 09:29:16 +08:00
|
|
|
|
using Microsoft.Extensions.Logging;
|
|
|
|
|
using ZstdSharp;
|
|
|
|
|
|
2024-02-02 17:14:41 +08:00
|
|
|
|
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;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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<StreamReader>(() => 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<StreamReader>(() => new StreamReader(ds));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override async ValueTask<bool> ReadAsync()
|
|
|
|
|
{
|
|
|
|
|
var str = await Reader.Value.ReadLineAsync();
|
|
|
|
|
if (string.IsNullOrWhiteSpace(str))
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
CurrentRaw = str;
|
|
|
|
|
|
|
|
|
|
var fields = ParseRow(str, QuoteChar, Delimiter);
|
|
|
|
|
Current = new DataRecord(fields, TableName, Headers) {RawField = str};
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override void Dispose()
|
|
|
|
|
{
|
|
|
|
|
base.Dispose();
|
|
|
|
|
if(Reader.IsValueCreated)
|
|
|
|
|
Reader.Value.Dispose();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|