Initial setup - gitea

This commit is contained in:
Vladimir K
2023-07-23 17:10:20 +03:00
parent f9c957506c
commit 232a59569c
12 changed files with 370 additions and 127 deletions

View File

@@ -1,83 +1,124 @@
using System;
using System.Collections.Generic;
using System.Data;
using System.Globalization;
using System.Collections.Generic;
using System.IO;
using System.Text;
using CsvHelper;
using CsvHelper.Configuration;
using NUnit.Framework;
using PriorBankParser.Dtos;
using static PriorBankParser.Constants.SectionNames;
using static PriorBankParser.Constants.SourceConfig;
namespace PriorBankParser
{
public class SectionParser
public class Parser
{
public enum SectionType
[Test]
public void Run()
{
AccountInfo,
StatementDetails,
ContractOperations,
ContractLocked,
ContractTotal,
StatementTotal
const string sourceDirectoryPath = @"D:\Cloud-storage\Dropbox\Home\Finance\Raw Source\";
const string resultFileName = @"ConvertedResult.csv";
var result = ParseFilesInDirectory(sourceDirectoryPath);
var resultFilePath = Path.Combine(sourceDirectoryPath, resultFileName);
WriteResult(resultFilePath, result);
}
public SectionParseResultDto Parse(string filePath)
private ICollection<TransactionDto> ParseFilesInDirectory(string directoryPath)
{
var result = new SectionParseResultDto();
var transactions = new List<TransactionInfoDto>();
result.Transactions = transactions;
var files = Directory.GetFiles(directoryPath, "*.csv");
var result = new List<TransactionDto>();
using var reader = new StreamReader(filePath);
using var csv = new CsvReader(reader, CultureInfo.InvariantCulture);
csv.Configuration.HasHeaderRecord = false;
csv.Configuration.RegisterClassMap<TransactionInfoDtoMap>();
//csv.Configuration.
var currentSection = SectionType.AccountInfo;
var contractName = string.Empty;
while (csv.Read())
foreach (var file in files)
{
var field = csv.GetField(0);
if (field.Equals(Constants.SectionNames.OperationSectionPrefix))
{
currentSection = SectionType.StatementTotal;
contractName = field.Replace(Constants.SectionNames.OperationSectionPrefix, string.Empty);
continue;
}
//switch (currentSection)
//{
// case "FooId":
// fooRecords.Add(csv.GetRecord<Foo>());
// break;
// case "BarId":
// barRecords.Add(csv.GetRecord<Bar>());
// break;
// default:
// throw new InvalidOperationException("Unknown record type.");
//}
result.AddRange(ParseFile(file));
}
return result;
}
}
public sealed class TransactionInfoDtoMap : ClassMap<TransactionInfoDto>
{
public TransactionInfoDtoMap()
private ICollection<TransactionDto> ParseFile(string filePath)
{
Map(m => m.TransactionDate).Name("Дата транзакции");
Map(m => m.OperationName).Name("Операция");
Map(m => m.Amount).Name("Сумма");
Map(m => m.Currency).Name("Валюта");
Map(m => m.OperationDate).Name("Дата операции по счету");
Map(m => m.Commission).Name("Комиссия/Money-back");
Map(m => m.AccountTurnover).Name("Обороты по счету");
Map(m => m.DigitalCard).Name("Цифровая карта");
Map(m => m.OperationCategory).Name("Категория операции");
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
var result = new List<TransactionDto>();
using var reader = new StreamReader(filePath, Encoding.GetEncoding(CodePage));
var contractName = SeekToTheTransactions(reader);
if (string.IsNullOrEmpty(contractName))
{
return result;
}
using var csvReader = new CsvReader(reader, SrcCsvConfiguration);
var isHeader = true;
var ignore = false;
while (csvReader.Read())
{
var field = csvReader.GetField(0);
if (field.Equals(StatementTotalSectionPrefix))
{
break;
}
if (field.Equals(CardTotalSectionPrefix))
{
ignore = true;
}
if (field.StartsWith(OperationSectionPrefix))
{
contractName = GetCardName(field);
isHeader = true;
continue;
}
if (isHeader)
{
csvReader.ReadHeader();
isHeader = false;
ignore = false;
continue;
}
if (ignore)
{
continue;
}
var record = csvReader.GetRecord<TransactionDto>();
record.Contract = contractName;
result.Add(record);
}
return result;
}
private void WriteResult(string resultFilePath, IEnumerable<TransactionDto> records)
{
using var writer = new StreamWriter(resultFilePath, false, Encoding.UTF8);
using var csv = new CsvWriter(writer, Constants.GetWriteConfig());
csv.WriteRecords(records);
}
private string SeekToTheTransactions(StreamReader reader)
{
while (!reader.EndOfStream)
{
var line = reader.ReadLine();
if (line != null && line.StartsWith(OperationSectionPrefix))
{
return GetCardName(line);
}
}
return null;
}
private string GetCardName(string sectionName)
{
return sectionName.Replace(OperationSectionPrefix, string.Empty);
}
}
}
}