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 ParseFilesInDirectory(string directoryPath) { var files = Directory.GetFiles(directoryPath, "*.csv"); var result = new List(); foreach (var file in files) { result.AddRange(ParseFile(file)); } return result; } private ICollection ParseFile(string filePath) { Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); var result = new List(); 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(); record.Contract = contractName; result.Add(record); } return result; } private void WriteResult(string resultFilePath, IEnumerable 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); } } }