using Microsoft.Extensions.Logging; using System.Collections.ObjectModel; using System.Globalization; namespace File_Folder_Helper.Day; internal static class Helper20231130 { private record Record(string File, string FileName, string Equipment, string TimeStamp); private static ReadOnlyDictionary GetSystemStates() { Dictionary results = []; results.Add("1", "cold-idle"); results.Add("2", "running"); results.Add("3", "run-wafer"); results.Add("4", "warm-idle"); results.Add("5", "pause"); results.Add("6", "suspend"); results.Add("7", "startup"); results.Add("8", "shutdown"); results.Add("9", "abort"); results.Add("10", "safety-1"); results.Add("11", "safety-2"); results.Add("12", "safety-3"); return new(results); } private static ReadOnlyCollection GetRecords(string sourceDirectory, string timestampFormat) { List results = []; Record record; string fileName; string equipment; string timestamp; string[] segments; string[] files = Directory.GetFiles(sourceDirectory, "*.pdsf", SearchOption.TopDirectoryOnly).ToArray(); foreach (string file in files) { fileName = Path.GetFileName(file); segments = fileName.Split('_'); if (segments.Length != 2) continue; equipment = segments[0]; timestamp = segments[1].Split('.')[0]; if (timestamp.Length != timestampFormat.Length) continue; record = new(file, fileName, equipment, timestamp); results.Add(record); } return new(results.OrderBy(l => l.TimeStamp).ToArray()); } internal static void RenameReactorProcessDataStandardFormatFiles(ILogger logger, List args) { string line; string[] lines; string[] values; string[] columns; DateTime dateTime; int? keyColumnIndex; string? systemState; string checkFileName; string keyColumnValue; string? lastColumn = null; List allLines = []; string keyColumn = args[3]; string sourceDirectory = args[0]; string timestampFormat = args[2]; if (!Directory.Exists(sourceDirectory)) throw new Exception(sourceDirectory); string missingKeyDirectory = Path.Combine(sourceDirectory, "Missing-Key"); if (!Directory.Exists(missingKeyDirectory)) _ = Directory.CreateDirectory(missingKeyDirectory); ReadOnlyDictionary systemStates = GetSystemStates(); ReadOnlyCollection records = GetRecords(sourceDirectory, timestampFormat); foreach (Record record in records) { lines = File.ReadAllLines(record.File); if (lines.Length < 8) continue; if (lines[6].Length < 1 || lines[6][0] != '"' || !lines[6].StartsWith("\"Time\"")) continue; if (lastColumn is not null && lines[6] != lastColumn) break; keyColumnIndex = null; lastColumn = lines[6]; if (allLines.Count == 0) allLines.Add($"\"Timestamp\"\t{lastColumn}"); columns = lines[6].Split('\t'); if (columns.Length < 3) continue; values = lines[7].Split('\t'); if (values.Length != columns.Length) continue; for (int i = 0; i < columns.Length; i++) { if (columns[i] != keyColumn) continue; keyColumnIndex = i; break; } if (keyColumnIndex is null) { File.Move(record.File, Path.Combine(sourceDirectory, missingKeyDirectory, record.FileName)); continue; } for (int i = 7; i < lines.Length; i++) { line = lines[i]; if (line.Length < 1 || line[0] == 'N' && line.StartsWith("NUM_DATA_ROWS\t")) break; allLines.Add($"'{record.TimeStamp}\t{line}"); } keyColumnValue = values[keyColumnIndex.Value]; logger.LogInformation("{timestamp} triggered", record.TimeStamp); if (!systemStates.TryGetValue(keyColumnValue, out systemState)) continue; checkFileName = Path.Combine(Path.GetDirectoryName(record.File) ?? throw new Exception(), $"{record.Equipment}-{record.TimeStamp}-{systemState}.pdsf"); File.Move(record.File, checkFileName); if (DateTime.TryParseExact(record.TimeStamp, timestampFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out dateTime)) File.SetLastWriteTime(checkFileName, dateTime); } File.WriteAllLines(Path.Combine(sourceDirectory, $"{DateTime.Now.Ticks}.tsv"), allLines); } }