using Microsoft.Extensions.Logging; namespace File_Folder_Helper.ADO2025.PI5; internal static partial class Helper20250306 { internal static void ProcessDataStandardFormatToJson(ILogger logger, List args) { string searchPattern = args[2]; 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 ProcessDataStandardFormatToJson(logger, files[0]); } private static void ProcessDataStandardFormatToJson(ILogger logger, string file) { string[] lines = File.ReadAllLines(file); int? columnTitlesLine = GetProcessDataStandardFormatColumnTitlesLine(lines); if (columnTitlesLine is null) logger.LogWarning("<{columnTitlesLine}> is null", nameof(columnTitlesLine)); else { string? text = ProcessDataStandardFormatToLastDataLine(lines, columnTitlesLine.Value); File.WriteAllText(".lbl", text); if (lines.Length < columnTitlesLine.Value + 1) logger.LogWarning("<{lines}>(s)", lines.Length); else { string json = ProcessDataStandardFormatToJson(columnTitlesLine.Value, [], lines); File.WriteAllText(".json", json); } } } private static int? GetProcessDataStandardFormatColumnTitlesLine(string[] lines) { int? result = null; for (int i = 0; i < lines.Length; i++) { if (lines[i].StartsWith("END_OFFSET") && i + 2 < lines.Length) { result = i + 1; break; } } return result; } private static string? ProcessDataStandardFormatToLastDataLine(string[] lines, int columnTitlesLine) { string? result = null; for (int i = columnTitlesLine + 1; i < lines.Length; i++) { if (lines[i].StartsWith("NUM_DATA_ROWS")) { result = lines[i - 1]; break; } } return result; } private static string ProcessDataStandardFormatToJson(int columnTitlesLine, string[] columns, string[] lines) { #pragma warning disable CA1845, IDE0057 string result = "[\n"; string line; string value; string[] segments; if (columns.Length == 0) columns = lines[columnTitlesLine].Trim().Split('\t'); for (int i = columnTitlesLine + 1; i < lines.Length; i++) { line = "{"; segments = lines[i].Trim().Split('\t'); if (segments.Length != columns.Length) break; for (int c = 1; c < segments.Length; c++) { value = segments[c].Replace("\"", "\\\"").Replace("\\", "\\\\"); line += '"' + columns[c].Trim('"') + '"' + ':' + '"' + value + '"' + ','; } line = line.Substring(0, line.Length - 1) + '}' + ',' + '\n'; result += line; } result = result.Substring(0, result.Length - 1) + ']'; return result; #pragma warning restore CA1845, IDE0057 } }