From 9d612d3d3da59fd214f3bfb2616db1e814bad6c0 Mon Sep 17 00:00:00 2001 From: Mike Phares Date: Sun, 26 Jan 2025 16:02:14 -0700 Subject: [PATCH] Move Bank PDF files to Year Month --- .vscode/launch.json | 25 +++++--- .vscode/settings.json | 2 + ADO2025/PI4/Helper-2025-01-26.cs | 93 ++++++++++++++++++++++++++++ Day/HelperDay.cs | 2 + Helpers/HelperPdfStripperWrapper.cs | 95 +++++++++++++++++++++-------- 5 files changed, 182 insertions(+), 35 deletions(-) create mode 100644 ADO2025/PI4/Helper-2025-01-26.cs diff --git a/.vscode/launch.json b/.vscode/launch.json index 7377fd8..5f1ceed 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -13,17 +13,26 @@ "args": [ "s", "X", - "Y:/TRendlog", - "Day-Helper-2025-01-14", - "New folder*|202*", - "yyyy-MM-dd", - "444", - "555", + "D:/5-Other-Small/Proxmox/ffnm", + "Day-Helper-2025-01-26", + "*.txt", + "MM/dd/yy", + "Statement Period", + "WOODS,JASON P", "666", "777", "888", - "999" - ], + "999", + "s", + "P", + "D:/5-Other-Small/Proxmox/ffnm", + "-d", + "L:/DevOps/Mesa_FI/File-Folder-Helper/.vscode", + "-k", + "Mike", + "-p", + "S" + ], "cwd": "${workspaceFolder}", "console": "integratedTerminal", "stopAtEntry": false diff --git a/.vscode/settings.json b/.vscode/settings.json index 76b0107..4148bb6 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -27,11 +27,13 @@ "Kanban", "kanbn", "Kofax", + "Linc", "mesfs", "NpgSql", "NSFX", "OBJE", "onenote", + "PDFC", "Permyriad", "pged", "Phares", diff --git a/ADO2025/PI4/Helper-2025-01-26.cs b/ADO2025/PI4/Helper-2025-01-26.cs new file mode 100644 index 0000000..7ac136d --- /dev/null +++ b/ADO2025/PI4/Helper-2025-01-26.cs @@ -0,0 +1,93 @@ +using Microsoft.Extensions.Logging; +using System.Collections.ObjectModel; +using System.Globalization; + +namespace File_Folder_Helper.ADO2025.PI4; + +internal static partial class Helper20250126 +{ + + private static void Move(string file, string fileName, string checkFile, List foundLines, ReadOnlyCollection dateTimes) + { + string checkDirectory = Path.Combine(Path.GetDirectoryName(file) ?? throw new Exception(), dateTimes[0].ToString("yyyy-MM")); + if (!Directory.Exists(checkDirectory)) + _ = Directory.CreateDirectory(checkDirectory); + string fileNameB = Path.GetFileName(checkFile); + string checkFileB = Path.Combine(checkDirectory, fileName); + string checkFileC = Path.Combine(checkDirectory, fileNameB); + string contents = string.Join(Environment.NewLine, foundLines); + string checkFileD = Path.Combine(checkDirectory, $"{fileName}.txt"); + if (!File.Exists(checkFileB)) + File.Move(file, checkFileB); + if (!File.Exists(checkFileC)) + File.Move(checkFile, checkFileC); + File.WriteAllText(checkFileD, contents); + } + + private static void Move(ILogger logger, string dateFormat, string file, string checkFile, string fileName, ReadOnlyCollection statementPeriodSegments, List foundLines) + { + DateTime dateTime; + List dateTimes = []; + foreach (string check in statementPeriodSegments) + { + if (!DateTime.TryParseExact(check, dateFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out dateTime)) + continue; + dateTimes.Add(dateTime); + } + if (dateTimes.Count != 2) + logger.LogInformation($"Only {dateTimes.Count} date(s) were found in <{fileName}>!"); + else + Move(file, fileName, checkFile, foundLines, dateTimes.AsReadOnly()); + } + + private static void Move(ILogger logger, string file, string checkFile, string dateFormat, string statementPeriod, string search) + { + List foundLines = []; + bool statementPeriodFound = false; + string[]? statementPeriodSegments = null; + string fileName = Path.GetFileName(file); + string[] lines = File.ReadAllLines(file); + foreach (string line in lines) + { + if (statementPeriodSegments is not null) + { + if (line.Contains(search)) + foundLines.Add(line); + } + else + { + if (statementPeriodFound) + { + statementPeriodSegments = line.Split(' '); + continue; + } + if (!line.Contains(statementPeriod)) + continue; + statementPeriodFound = true; + } + } + if (statementPeriodSegments is null || statementPeriodSegments.Length < 4) + logger.LogInformation($"{nameof(statementPeriod)}: {statementPeriod}; wasn't found in <{fileName}>!"); + else + Move(logger, dateFormat, file, checkFile, fileName, statementPeriodSegments.AsReadOnly(), foundLines); + } + + internal static void Move(ILogger logger, List args) + { + string checkFile; + string search = args[5]; + string dateFormat = args[3]; + string searchPatterns = args[2]; + string statementPeriod = args[4]; + string sourceDirectory = Path.GetFullPath(args[0]); + string[] files = Directory.GetFiles(sourceDirectory, searchPatterns, SearchOption.AllDirectories); + foreach (string file in files) + { + checkFile = Path.ChangeExtension(file, ".pdf"); + if (!File.Exists(checkFile)) + continue; + Move(logger, file, checkFile, dateFormat, statementPeriod, search); + } + } + +} \ No newline at end of file diff --git a/Day/HelperDay.cs b/Day/HelperDay.cs index b505edd..8681ae9 100644 --- a/Day/HelperDay.cs +++ b/Day/HelperDay.cs @@ -129,6 +129,8 @@ internal static class HelperDay ADO2025.PI4.Helper20250101.MoveToDelete(logger, args); else if (args[1] == "Day-Helper-2025-01-14") ADO2025.PI4.Helper20250114.Rename(logger, args); + else if (args[1] == "Day-Helper-2025-01-26") + ADO2025.PI4.Helper20250126.Move(logger, args); else throw new Exception(appSettings.Company); } diff --git a/Helpers/HelperPdfStripperWrapper.cs b/Helpers/HelperPdfStripperWrapper.cs index 127f379..d7f33dc 100644 --- a/Helpers/HelperPdfStripperWrapper.cs +++ b/Helpers/HelperPdfStripperWrapper.cs @@ -10,6 +10,11 @@ internal static class HelperPdfStripperWrapper string? Key, char? Parser); + private const char _Linc = 'L'; + private const char _Ghost = 'G'; + private const char _Kofax = 'K'; + private const char _Stripper = 'S'; + private static string GetTextFromPDF(string pdfTextStripperFileName, string sourceFileNamePdf, string destinationFileName) { string result; @@ -28,14 +33,27 @@ internal static class HelperPdfStripperWrapper return result; } + private static string GetLincTextFromPDF(string lincPDFCFileName, string sourceFileNamePdf, string destinationFileName) + { + string result; + if (File.Exists(destinationFileName)) + File.Delete(destinationFileName); + string arguments = string.Concat("-i \"", sourceFileNamePdf, "\" -o \"", destinationFileName, "\""); + Process? process = Process.Start(lincPDFCFileName, arguments); + _ = process?.WaitForExit(30000); + if (!File.Exists(destinationFileName)) + result = string.Empty; + else + result = File.ReadAllText(destinationFileName); + return result; + } + private static string GetGhostTextFromPDF(string ghostPCLFileName, string sourceFileNamePdf, string destinationFileName) { string result; if (File.Exists(destinationFileName)) File.Delete(destinationFileName); - //string arguments = $"-i \"{sourceFile}\" -o \"{result}\""; string arguments = $"-dSAFER -dBATCH -dNOPAUSE -dFIXEDMEDIA -dFitPage -dAutoRotatePages=/All -dDEVICEWIDTHPOINTS=792 -dDEVICEHEIGHTPOINTS=612 -sOutputFile=\"{destinationFileName}\" -sDEVICE=pdfwrite \"{sourceFileNamePdf}\""; - //Process process = Process.Start(configData.LincPDFCFileName, arguments); Process? process = Process.Start(ghostPCLFileName, arguments); _ = process?.WaitForExit(30000); if (!File.Exists(destinationFileName)) @@ -83,11 +101,11 @@ internal static class HelperPdfStripperWrapper d = Path.Combine(d, directoryName); if (!string.IsNullOrEmpty(d) && !Directory.Exists(d)) _ = Directory.CreateDirectory(d); - char? parser = p is null ? null : p == "S" ? 'S' : p == "G" ? 'G' : p == "K" ? 'K' : null; + char? parser = p is null ? null : p == "S" ? _Stripper : p == "G" ? _Ghost : p == "K" ? _Kofax : p == "L" ? _Linc : null; return new(d, k, parser); } - private static void ParseSave(ILogger log, string pdfTextStripperFileName, string ghostPCLFileName, string kofaxFileName, string destinationDirectory, char parser, string[] files) + private static void ParseSave(ILogger log, string pdfTextStripperFileName, string ghostPCLFileName, string kofaxFileName, string lincPDFCFileName, string destinationDirectory, char parser, string[] files) { string text; string destinationFileName; @@ -96,12 +114,14 @@ internal static class HelperPdfStripperWrapper foreach (string file in files) { destinationFileName = Path.Combine(destinationDirectory, $"{file}.txt"); - if (parser == 'S') - text = GetTextFromPDF(pdfTextStripperFileName, file, destinationFileName); - else if (parser == 'G') - text = GetGhostTextFromPDF(ghostPCLFileName, file, destinationFileName); - else if (parser == 'K') + if (parser == _Kofax) text = GetKofaxTextFromPDF(kofaxFileName, file, destinationFileName); + else if (parser == _Linc) + text = GetLincTextFromPDF(lincPDFCFileName, file, destinationFileName); + else if (parser == _Ghost) + text = GetGhostTextFromPDF(ghostPCLFileName, file, destinationFileName); + else if (parser == _Stripper) + text = GetTextFromPDF(pdfTextStripperFileName, file, destinationFileName); else throw new NotImplementedException(); log.LogInformation("<{file}> == {length}", Path.GetFileName(file), text.Length); @@ -135,35 +155,56 @@ internal static class HelperPdfStripperWrapper internal static void ParseSave(ILogger log, List args) { - string pdfTextStripperFileName = Path.Combine(AppContext.BaseDirectory, "PDF-Text-Stripper.exe"); - if (!File.Exists(pdfTextStripperFileName)) - log.LogInformation("exe <{pdfTextStripperFileName}> doesn't exist!", pdfTextStripperFileName); + // + // NU1701 + // + // + // + // PreserveNewest + // + // + // PreserveNewest + // + // + // PreserveNewest + // + // + string sourceDirectory = Path.GetFullPath(args[0]); + Input input = GetInput(args); + if (string.IsNullOrEmpty(input.DestinationDirectory)) + log.LogInformation("-d <{DestinationDirectory}> wasn't supplied!", nameof(input.DestinationDirectory)); else { - string ghostPCLFileName = Path.Combine(AppContext.BaseDirectory, "gPcl6win64.exe"); - if (!File.Exists(ghostPCLFileName)) - log.LogInformation("exe <{ghostPCLFileName}> doesn't exist!", ghostPCLFileName); + if (input.Parser is null) + log.LogInformation("-p <{Parser}> wasn't supplied!", nameof(input.Parser)); else { - string kofaxFileName = "C:/Program Files (x86)/Kofax/Power PDF 50/batchConverter.com"; - if (!File.Exists(kofaxFileName)) - log.LogInformation("exe <{kofaxFileName}> doesn't exist!", kofaxFileName); + string pdfTextStripperFileName = Path.Combine(AppContext.BaseDirectory, "PDF-Text-Stripper.exe"); + if (input.Parser == _Stripper && !File.Exists(pdfTextStripperFileName)) + log.LogInformation("exe <{pdfTextStripperFileName}> doesn't exist!", pdfTextStripperFileName); else { - Input input = GetInput(args); - if (string.IsNullOrEmpty(input.DestinationDirectory)) - log.LogInformation("-d <{DestinationDirectory}> wasn't supplied!", nameof(input.DestinationDirectory)); + string ghostPCLFileName = Path.Combine(AppContext.BaseDirectory, "gPcl6win64.exe"); + if (input.Parser == _Ghost && !File.Exists(ghostPCLFileName)) + log.LogInformation("exe <{ghostPCLFileName}> doesn't exist!", ghostPCLFileName); else { - if (input.Parser is null) - log.LogInformation("-p <{Parser}> wasn't supplied!", nameof(input.Parser)); + string kofaxFileName = "C:/Program Files (x86)/Kofax/Power PDF 50/batchConverter.com"; + if (input.Parser == _Kofax && !File.Exists(kofaxFileName)) + log.LogInformation("exe <{kofaxFileName}> doesn't exist!", kofaxFileName); else { - string[] files = Directory.GetFiles(args[0], "*.pdf", SearchOption.TopDirectoryOnly); - if (files.Length == 0) - log.LogInformation("Length == {length}", files.Length); + string lincPDFCFileName = Path.Combine(AppContext.BaseDirectory, "LincPDFC.exe"); + if (input.Parser == _Kofax && !File.Exists(lincPDFCFileName)) + log.LogInformation("exe <{lincPDFCFileName}> doesn't exist!", lincPDFCFileName); else - ParseSave(log, pdfTextStripperFileName, ghostPCLFileName, kofaxFileName, input.DestinationDirectory, input.Parser.Value, files); + { + string[] files = Directory.GetFiles(sourceDirectory, "*.pdf", SearchOption.TopDirectoryOnly); + if (files.Length == 0) + log.LogInformation("Length == {length}", files.Length); + else + ParseSave(log, pdfTextStripperFileName, ghostPCLFileName, kofaxFileName, lincPDFCFileName, input.DestinationDirectory, input.Parser.Value, files); + } } } }