using Adaptation.Shared; using Adaptation.Shared.Methods; using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Linq; using System.Text.Json; using System.Text.Json.Serialization; using System.Text.RegularExpressions; namespace Adaptation.FileHandlers.csv; public class ProcessData : IProcessData { private readonly List _Details; public string JobID { get; set; } public string MesEntity { get; set; } public MetaData MetaData { get; set; } List Shared.Properties.IProcessData.Details => _Details; public ProcessData(IFileRead fileRead, Logistics logistics, List fileInfoCollection, CommaSeparatedValuesConfiguration commaSeparatedValuesConfiguration, string csvFile, MetaData metaData) { JobID = logistics.JobID; fileInfoCollection.Clear(); _Details = new List(); MesEntity = logistics.MesEntity; Parse(fileRead, logistics, fileInfoCollection, commaSeparatedValuesConfiguration, csvFile, metaData); } string IProcessData.GetCurrentReactor(IFileRead fileRead, Logistics logistics, Dictionary reactors) => throw new Exception(string.Concat("See ", nameof(Parse))); Tuple> IProcessData.GetResults(IFileRead fileRead, Logistics logistics, List fileInfoCollection) { Tuple> results; List tests = new(); foreach (object item in _Details) tests.Add(Test.Climatec); List descriptions = fileRead.GetDescriptions(fileRead, tests, this); if (tests.Count != descriptions.Count) throw new Exception(); for (int i = 0; i < tests.Count; i++) { if (descriptions[i] is not Description description) throw new Exception(); if (description.Test != (int)tests[i]) throw new Exception(); } List fileReadDescriptions = (from l in descriptions select (Description)l).ToList(); string json = JsonSerializer.Serialize(fileReadDescriptions, fileReadDescriptions.GetType()); JsonElement[] jsonElements = JsonSerializer.Deserialize(json); results = new Tuple>(logistics.Logistics1[0], tests.ToArray(), jsonElements, fileInfoCollection); return results; } #nullable enable internal static MetaData? GetMetaData(CommaSeparatedValuesConfiguration commaSeparatedValuesConfiguration, string fileNameWithoutExtension) { MetaData? result; Match match = Regex.Match(fileNameWithoutExtension, commaSeparatedValuesConfiguration.RegularExpressionPattern); if (!match.Success || match.Groups.Count != commaSeparatedValuesConfiguration.RegularExpressionGroupCount) result = null; else { int deviceId = int.Parse(match.Groups["DeviceId"].Value); int deviceNumber = int.Parse(match.Groups["DeviceNumber"].Value); result = new() { DeviceId = deviceId, DeviceType = match.Groups["DeviceType"].Value, DeviceNumber = deviceNumber, DescriptionName = match.Groups["DescriptionName"].Value, DescriptionTest = match.Groups["DescriptionTest"].Value, Frequency = match.Groups["Frequency"].Value, Date = match.Groups["Date"].Value }; } return result; } #pragma warning disable IDE0060 private void Parse(IFileRead fileRead, Logistics logistics, List fileInfoCollection, CommaSeparatedValuesConfiguration commaSeparatedValuesConfiguration, string csvFile, MetaData metaData) #pragma warning restore IDE0060 { string[] lines = File.ReadAllLines(csvFile); string line = lines[0]; string[] columns = line.Split('"'); fileInfoCollection.Add(new FileInfo(csvFile)); if (columns.Length == commaSeparatedValuesConfiguration.Columns) { string test = columns[commaSeparatedValuesConfiguration.TestIndex].Trim().Trim('"'); if (test.IndexOf(metaData.DescriptionTest, 0, StringComparison.CurrentCultureIgnoreCase) > -1 && test.IndexOf(metaData.DescriptionName, 0, StringComparison.CurrentCultureIgnoreCase) > -1) { for (int i = 1; i < lines.Length; i++) { line = lines[i]; if (line.Length < 1) continue; columns = line.Split(',').Select(l => l.Trim().Trim('"')).ToArray(); if (columns.Length != commaSeparatedValuesConfiguration.Columns) continue; _Details.Add(new Record() { Test = metaData.DescriptionTest, Date = columns[0], Value = columns[1], Event = columns[2] }); } MetaData = metaData; } } } internal static List GetDescriptions(JsonElement[] jsonElements) { List results = new(); Description? description; JsonSerializerOptions jsonSerializerOptions = new() { NumberHandling = JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString }; foreach (JsonElement jsonElement in jsonElements) { if (jsonElement.ValueKind != JsonValueKind.Object) throw new Exception(); description = JsonSerializer.Deserialize(jsonElement.ToString(), jsonSerializerOptions); if (description is null) continue; results.Add(description); } return results; } }