修改
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using ConsoleApp2.Helpers;
|
||||
using ConsoleApp2.HostedServices.Abstractions;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace ConsoleApp2.Services;
|
||||
@@ -7,45 +9,52 @@ namespace ConsoleApp2.Services;
|
||||
/// <summary>
|
||||
/// CSV文件读取
|
||||
/// </summary>
|
||||
public class CsvSource
|
||||
public class CsvSource:IDataSource
|
||||
{
|
||||
private readonly string _filePath;
|
||||
private readonly StreamReader _reader;
|
||||
protected readonly string _inputDir;
|
||||
//protected readonly StreamReader _reader;
|
||||
private readonly ILogger? _logger;
|
||||
private readonly string _tableName;
|
||||
protected readonly string _tableName;
|
||||
protected string _sqlFilePath;
|
||||
protected readonly string _sqlFileText;
|
||||
|
||||
public DataRecord Current { get; private set; }
|
||||
public string[]? Headers { get; }
|
||||
public string? CurrentRaw { get; private set; }
|
||||
//public DataRecord Current { get; protected set; }
|
||||
//public string[]? Headers { get; }
|
||||
public string? CurrentRaw { get; protected set; }
|
||||
public string Delimiter { get; private set; }
|
||||
public char QuoteChar { get; private set; }
|
||||
|
||||
public CsvSource(string filePath, string[]? headers = null, string delimiter = ",", char quoteChar = '"',
|
||||
public CsvSource(string inputDir,string tableName,string delimiter = ",", char quoteChar = '"',
|
||||
ILogger? logger = null)
|
||||
{
|
||||
_filePath = filePath;
|
||||
Headers = headers;
|
||||
_inputDir = inputDir;
|
||||
_tableName = tableName;
|
||||
//Headers = headers;
|
||||
_logger = logger;
|
||||
Delimiter = delimiter;
|
||||
QuoteChar = quoteChar;
|
||||
|
||||
var fs = File.OpenRead(filePath);
|
||||
_reader = new StreamReader(fs);
|
||||
_tableName = DumpDataHelper.GetTableName(filePath);
|
||||
//var fs = File.OpenRead(filePath);
|
||||
//_reader = new StreamReader(fs);
|
||||
//_tableName = DumpDataHelper.GetTableName(filePath);
|
||||
string pattern = $"^.*\\.{tableName}\\..*\\.sql$";
|
||||
_sqlFilePath = Directory.GetFiles(_inputDir).FirstOrDefault(s => Regex.Match(s, pattern).Success);
|
||||
|
||||
|
||||
}
|
||||
|
||||
public async ValueTask<bool> ReadAsync()
|
||||
{
|
||||
var str = await _reader.ReadLineAsync();
|
||||
if (string.IsNullOrWhiteSpace(str))
|
||||
return false;
|
||||
//public virtual async ValueTask<bool> ReadAsync()
|
||||
//{
|
||||
// var str = await _reader.ReadLineAsync();
|
||||
// if (string.IsNullOrWhiteSpace(str))
|
||||
// return false;
|
||||
|
||||
CurrentRaw = str;
|
||||
// CurrentRaw = str;
|
||||
|
||||
var fields = ParseRow2(str, QuoteChar, Delimiter);
|
||||
Current = new DataRecord(fields, _tableName, Headers);
|
||||
return true;
|
||||
}
|
||||
// var fields = ParseRow2(str, QuoteChar, Delimiter);
|
||||
// Current = new DataRecord(fields, _tableName, Headers);
|
||||
// return true;
|
||||
//}
|
||||
|
||||
public string[] ParseRow(string row, char quoteChar, string delimiter)
|
||||
{
|
||||
@@ -136,4 +145,64 @@ public class CsvSource
|
||||
result.Add(current.ToString());
|
||||
return result.ToArray();
|
||||
}
|
||||
public virtual async Task<string[]> GetHeaders()
|
||||
{
|
||||
var text = await File.ReadAllTextAsync(_sqlFilePath);
|
||||
return await DumpDataHelper.GetCsvHeadersFromSqlFileAsync(text);
|
||||
|
||||
}
|
||||
public virtual async Task<string[]> GetCsvFiles()
|
||||
{
|
||||
var text= await File.ReadAllTextAsync(_sqlFilePath);
|
||||
return await DumpDataHelper.GetCsvFileNamesFromSqlFileAsync(text,new Regex(@"'.+\.dat'"));
|
||||
}
|
||||
public virtual async Task DoEnqueue(Action<DataRecord> action)
|
||||
{
|
||||
var sourceFiles =await GetCsvFiles();
|
||||
foreach (var file in sourceFiles)
|
||||
{
|
||||
var headers = await GetHeaders();
|
||||
var filePath= Path.Combine(_inputDir, file);
|
||||
using (var fs = File.OpenRead(filePath))
|
||||
{
|
||||
using (StreamReader sr = new StreamReader(fs))
|
||||
{
|
||||
while (!sr.EndOfStream)
|
||||
{
|
||||
var line = await sr.ReadLineAsync();
|
||||
var fields = ParseRow2(line, QuoteChar, Delimiter);
|
||||
var record = new DataRecord(fields, _tableName, headers);
|
||||
action?.Invoke(record);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
public virtual async Task<DataRecord?> GetTestRecord()
|
||||
{
|
||||
var sourceFiles = await GetCsvFiles();
|
||||
var file = sourceFiles.FirstOrDefault();
|
||||
if (file != null)
|
||||
{
|
||||
var headers = await GetHeaders();
|
||||
var filePath = Path.Combine(_inputDir, file);
|
||||
using (var fs = File.OpenRead(filePath))
|
||||
{
|
||||
using (StreamReader sr = new StreamReader(fs))
|
||||
{
|
||||
var line = await sr.ReadLineAsync();
|
||||
var fields = ParseRow2(line, QuoteChar, Delimiter);
|
||||
var record = new DataRecord(fields, _tableName, headers);
|
||||
return record;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
public void Dispose()
|
||||
{
|
||||
// _reader.Dispose();
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user