64 lines
2.4 KiB
C#
64 lines
2.4 KiB
C#
using ConsoleApp2.Options;
|
||
using Microsoft.Extensions.Logging;
|
||
|
||
namespace ConsoleApp2.Services.ETL;
|
||
|
||
/// <summary>
|
||
/// 截取提供ZST文件中的第一行,然后复制成指定数量的数据
|
||
/// </summary>
|
||
public class ZstMockReader : ZstReader
|
||
{
|
||
private long _currentCount;
|
||
private readonly long _mockCount;
|
||
private DataRecord? _template;
|
||
private readonly bool _deepCopy;
|
||
private readonly string[]? _autoIncrementColumn;
|
||
|
||
static readonly IReadOnlyList<int> Range = [500, 1500, 2500];
|
||
|
||
public ZstMockReader(TableMockConfig mockConfig, string filePath, string tableName, string[] headers, string delimiter = ",", char quoteChar = '\"', ILogger? logger = null) : base(filePath, tableName, headers, delimiter, quoteChar, logger)
|
||
{
|
||
_mockCount = mockConfig.MockCount;
|
||
_deepCopy = mockConfig.UseDeepCopy;
|
||
_autoIncrementColumn = mockConfig.AutoIncrementColumn;
|
||
}
|
||
|
||
public ZstMockReader(TableMockConfig mockConfig, Stream stream, string tableName, string[] headers, string delimiter = ",", char quoteChar = '\"', ILogger? logger = null) : base(stream, tableName, headers, delimiter, quoteChar, logger)
|
||
{
|
||
_mockCount = mockConfig.MockCount;
|
||
_deepCopy = mockConfig.UseDeepCopy;
|
||
_autoIncrementColumn = mockConfig.AutoIncrementColumn;
|
||
}
|
||
|
||
public override async ValueTask<bool> ReadAsync()
|
||
{
|
||
if (_template is null)
|
||
{
|
||
if (!await base.ReadAsync())
|
||
throw new InvalidOperationException("所提供的ZST源为空,无法生成模板数据");
|
||
_template = Current.Clone() as DataRecord;
|
||
if (_template is null)
|
||
throw new ApplicationException("记录拷贝失败");
|
||
_currentCount++;
|
||
return true;
|
||
}
|
||
|
||
if (_deepCopy)
|
||
{
|
||
Current = _template.Clone() as DataRecord ?? throw new ApplicationException("记录拷贝失败");
|
||
if(_autoIncrementColumn is not null)
|
||
{
|
||
foreach (var column in _autoIncrementColumn)
|
||
{
|
||
Current[column] = (Convert.ToInt64(Current[column]) + 1).ToString();
|
||
_template = Current;
|
||
}
|
||
}
|
||
|
||
Current["CompanyID"] = Range[Random.Shared.Next(0, Range.Count)].ToString();//随机CompanyID
|
||
}
|
||
else Current = _template;
|
||
_currentCount++;
|
||
return _currentCount < _mockCount;
|
||
}
|
||
} |