Files
2023-07-23 17:10:20 +03:00

125 lines
3.6 KiB
C#

using System.Collections.Generic;
using System.IO;
using System.Text;
using CsvHelper;
using NUnit.Framework;
using PriorBankParser.Dtos;
using static PriorBankParser.Constants.SectionNames;
using static PriorBankParser.Constants.SourceConfig;
namespace PriorBankParser
{
public class Parser
{
[Test]
public void Run()
{
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);
}
private ICollection<TransactionDto> ParseFilesInDirectory(string directoryPath)
{
var files = Directory.GetFiles(directoryPath, "*.csv");
var result = new List<TransactionDto>();
foreach (var file in files)
{
result.AddRange(ParseFile(file));
}
return result;
}
private ICollection<TransactionDto> ParseFile(string filePath)
{
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);
}
}
}