Initial setup - gitea
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user