125 lines
3.6 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|