From 384c83304b2dcf07694043e08de85ff7d5f64184 Mon Sep 17 00:00:00 2001 From: Mike Phares Date: Sat, 1 Mar 2025 09:20:35 -0700 Subject: [PATCH] PostgresDumpToJson --- .vscode/launch.json | 22 ++++-- ADO2025/PI5/Helper-2025-02-28.cs | 122 +++++++++++++++++++++++++++++++ Day/HelperDay.cs | 2 + 3 files changed, 141 insertions(+), 5 deletions(-) create mode 100644 ADO2025/PI5/Helper-2025-02-28.cs diff --git a/.vscode/launch.json b/.vscode/launch.json index 188c226..94ecec5 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -13,14 +13,26 @@ "args": [ "s", "X", - "\\\\mesfs.infineon.com\\EC_Characterization_Si\\Archive\\HGCV1\\2025_Week_09\\2025-02-24", + "L:/Git/pocketbase_0.25.8_windows_amd64", + "Day-Helper-2025-02-28", + "immich-db-backup-1739350800014.sql", + "COPY_public.", + "FROM_stdin", + "555", + "666", + "777", + "888", + "999", + "s", + "X", + "\\\\mesfs.infineon.com\\EC_Characterization_Si\\Archive\\BIORAD4\\2025_Week_09\\2025-02-28\\-660626-_2025-02-28_04;49_PM_395577460", "Day-Helper-2025-02-19", "csv-*.pdsf", "*.pdsf", - "Test,Count,MesEntity,HeaderUniqueId,UniqueId,Id,Recipe,Date,AreaDeltaFromLastRun,GLimit,HGCV1", - "Nine10mmEdgeMean,Nine4mmEdgeMean,NineCriticalPointsAverage,NineCriticalPointsPhaseAngleAverage,NineCriticalPointsStdDev,NineEdgeMeanDelta,NineMean,NineResRangePercent,AreaDeltaFromLastRun,Variation,Percentage HgCV 4PP Delta,HGCV1", - "RhoAvg01,RhoAvg02,RhoAvg03,RhoAvg04,RhoAvg05,RhoAvg06,RhoAvg07,RhoAvg08,RhoAvg09,HGCV1", - "FlatZMean|MeanFlatZ,GradeMean|MeanGrade,NAvgMean|MeanNAvg,NslMean|MeanNsl,PhaseMean|MeanPhase,RhoAvgMean|MeanRhoAvg,RhoslMean|MeanRhosl,RsMean|MeanRs,VdMean|MeanVd,FlatZRadialGradient|RadialGradientFlatZ,GradeRadialGradient|RadialGradientGrade,NAvgRadialGradient|RadialGradientNAvg,NslRadialGradient|RadialGradientNsl,PhaseRadialGradient|RadialGradientPhase,RhoAvgRadialGradient|RadialGradientRhoAvg,RhoslRadialGradient|RadialGradientRhosl,RsRadialGradient|RadialGradientRs,VdRadialGradient|RadialGradientVd,FlatZStdDev|StandardDeviationPercentageFlatZ,GradeStdDev|StandardDeviationPercentageGrade,NAvgStdDev|StandardDeviationPercentageNAvg,NslStdDev|StandardDeviationPercentageNsl,PhaseStdDev|StandardDeviationPercentagePhase,RhoAvgStdDev|StandardDeviationPercentageRhoAvg,RhoslStdDev|StandardDeviationPercentageRhosl,RsStdDev|StandardDeviationPercentageRs,VdStdDev|StandardDeviationPercentageVd,|HGCV1", + "Test,Count,MesEntity,HeaderUniqueId,UniqueId,Date,Wafer,Position,BIORAD4", + ",BIORAD4", + ",BIORAD4", + "MID|Cassette,Lot|Batch,Title|Batch,Wafer|Text,Thickness|Site,MeanThickness|GradeMean,|BIORAD4", "888", "999", "s", diff --git a/ADO2025/PI5/Helper-2025-02-28.cs b/ADO2025/PI5/Helper-2025-02-28.cs new file mode 100644 index 0000000..22b4250 --- /dev/null +++ b/ADO2025/PI5/Helper-2025-02-28.cs @@ -0,0 +1,122 @@ +using Microsoft.Extensions.Logging; +using System.Collections.ObjectModel; +using System.Text.Json; + +namespace File_Folder_Helper.ADO2025.PI5; + +internal static partial class Helper20250228 +{ + + private record Record(string TableName, ReadOnlyCollection Columns, ReadOnlyCollection Rows); + + private static ReadOnlyCollection GetRecords(string headerA, string headerB, string file) + { + List results = []; + string line; + string[] segmentsA; + string[] segmentsB; + string[] segmentsC; + string[] segmentsD; + string[] segmentsE; + string[] segmentsF; + List rows; + string? tableName = null; + string[] lines = File.ReadAllLines(file); + ReadOnlyCollection? columns = null; + for (int i = 0; i < lines.Length; i++) + { + line = lines[i]; + if (tableName is null) + { + segmentsA = line.Split(headerA); + if (segmentsA.Length != 2) + continue; + segmentsB = segmentsA[1].Split(headerB); + if (segmentsB.Length != 2) + continue; + segmentsC = segmentsB[0].Split('('); + if (segmentsC.Length != 2) + continue; + segmentsD = segmentsC[1].Split(')'); + if (segmentsD.Length != 2) + continue; + columns = segmentsD[0].Split(',').Select(l => l.Trim(' ').Trim('"')).ToArray().AsReadOnly(); + if (columns.Count == 0) + continue; + segmentsE = segmentsB[0].Split(' '); + tableName = segmentsE[0]; + } + else if (columns is null) + break; + else + { + rows = []; + for (int j = i + 1; j < lines.Length; j++) + { + i = j; + segmentsF = lines[j].Split('\t'); + if (segmentsF.Length != columns.Count) + { + if (rows.Count > 0) + results.Add(new(TableName: tableName, Columns: columns, Rows: rows.AsReadOnly())); + break; + } + rows.Add(segmentsF); + } + columns = null; + tableName = null; + } + } + return results.AsReadOnly(); + } + + private static void WriteFile(string file, ReadOnlyCollection records) + { + List results = []; + string json; + string text; + Dictionary keyValuePairs = []; + foreach (Record record in records) + { + results.Clear(); + foreach (string[] row in record.Rows) + { + keyValuePairs.Clear(); + for (int i = 0; i < row.Length; i++) + { + if (row[i] == "\\N") + keyValuePairs.Add(record.Columns[i], null); + else + keyValuePairs.Add(record.Columns[i], row[i]); + } + json = JsonSerializer.Serialize(keyValuePairs); + results.Add(json); + } + text = string.Join($",{Environment.NewLine}", results); + File.WriteAllText($"{file[..^4]}-{record.TableName}.json", $"[{Environment.NewLine}{text}{Environment.NewLine}]"); + } + } + + private static void PostgresDumpToJson(ILogger logger, string headerA, string headerB, string file) + { + ReadOnlyCollection records = GetRecords(headerA, headerB, file); + if (records.Count > 0) + WriteFile(file, records); + else + logger.LogWarning("<{records}>(s)", records.Count); + } + + internal static void PostgresDumpToJson(ILogger logger, List args) + { + string searchPattern = args[2]; + string headerA = args[3].Replace('_', ' '); + string headerB = args[4].Replace('_', ' '); + string sourceDirectory = Path.GetFullPath(args[0]); + string[] files = Directory.GetFiles(sourceDirectory, searchPattern, SearchOption.AllDirectories); + if (files.Length != 1) + logger.LogWarning("<{files}>(s)", files.Length); + else + PostgresDumpToJson(logger, headerA, headerB, files[0]); + } + +} \ No newline at end of file diff --git a/Day/HelperDay.cs b/Day/HelperDay.cs index 629e817..1aa66ad 100644 --- a/Day/HelperDay.cs +++ b/Day/HelperDay.cs @@ -137,6 +137,8 @@ internal static class HelperDay ADO2025.PI5.Helper20250218.MoveToArchive(logger, args); else if (args[1] == "Day-Helper-2025-02-19") ADO2025.PI5.Helper20250219.Compare(logger, args); + else if (args[1] == "Day-Helper-2025-02-28") + ADO2025.PI5.Helper20250228.PostgresDumpToJson(logger, args); else throw new Exception(appSettings.Company); }