using System; using System.Collections.Generic; namespace Adaptation.FileHandlers.QS408M; public class TXT { public Header Header { get; set; } public Body Body { get; set; } public Footer Footer { get; set; } private int _I; private readonly string _Data; public TXT(LastProcessData lastProcessData, string receivedData) { _I = 0; Site site; bool usedLast; _Data = receivedData; List sites = new(); const string twoSpaces = " "; string title = GetBefore("Recipe:"); string recipeAndDateTime = GetToEOL(); string recipe = recipeAndDateTime.Length < twoSpaces.Length ? recipeAndDateTime.Trim() : !recipeAndDateTime.Contains(twoSpaces) ? recipeAndDateTime.Substring(0, 25).Trim() : recipeAndDateTime.Split(new string[] { twoSpaces }, StringSplitOptions.None)[0].Trim(); string dateTime = recipeAndDateTime.Substring(recipe.Length).Trim(); if (dateTime.EndsWith(".")) dateTime = dateTime.Remove(dateTime.Length - 1, 1); ScanPast("operator:"); string @operator = GetBefore("batch:"); string batch = GetToEOL(); ScanPast("cassette:"); if (!receivedData.Contains("cassette:")) title = string.Empty; string cassette = GetBefore("wafer:"); if (string.IsNullOrEmpty(batch)) { _I = 0; _Data = receivedData; ScanPast("wafer:"); } string wafer = GetToEOL(); _ = GetToEOL(); _ = GetToEOL(); if (string.IsNullOrEmpty(wafer)) throw new Exception("Wafer field is missing."); if (!string.IsNullOrEmpty(title)) usedLast = false; else { title = lastProcessData.Title; recipe = lastProcessData.Recipe; @operator = lastProcessData.Operator; batch = lastProcessData.Batch; cassette = lastProcessData.Cassette; usedLast = true; } string token = GetToken(); while (true) { if (string.IsNullOrEmpty(token) || !char.IsDigit(token[0])) break; site = new() { Position = token, Thickness = GetToken(), }; sites.Add(site); token = GetToken(); } ScanPast("mean thickness ="); string meanThickness = GetBefore(", std. dev ="); string stdDev = GetToken(); string passFail = GetToEOL(); _ = GetToEOL(); _ = GetToEOL(); string line = GetToEOL(); ScanPast("thickness"); string radialVariationThickness = GetToEOL(); _ = GetToEOL(); ScanPast("Slot:"); string slot = GetBefore(";"); Header = new() { Title = title, Recipe = recipe, DateTime = dateTime, Operator = @operator, Batch = batch, Cassette = cassette, UsedLast = usedLast, Wafer = wafer, }; Body = new() { Sites = sites, WaferMeanThickness = meanThickness, StdDev = stdDev, PassFail = passFail, }; Footer = new() { Line = line, RadialVariationThickness = radialVariationThickness, Slot = slot, }; lastProcessData.Title = title; lastProcessData.Recipe = recipe; lastProcessData.Operator = @operator; lastProcessData.Batch = batch; lastProcessData.Cassette = cassette; } private string GetBefore(string text) { string str; string str1; int num = _Data.IndexOf(text, _I); if (num <= -1) { str = _Data.Substring(_I); _I = _Data.Length; str1 = str.Trim(); } else { str = _Data.Substring(_I, num - _I); _I = num + text.Length; str1 = str.Trim(); } return str1; } private string GetToEOL() { string result; if (_Data.IndexOf("\n", _I) > -1) result = GetBefore("\n"); else result = GetBefore(Environment.NewLine); return result; } private string GetToken() { while (true) { if (_I >= _Data.Length || !IsNullOrWhiteSpace(_Data.Substring(_I, 1))) { break; } _I++; } int num = _I; while (true) { if (num >= _Data.Length || IsNullOrWhiteSpace(_Data.Substring(num, 1))) { break; } num++; } string str = _Data.Substring(_I, num - _I); _I = num; return str.Trim(); } private static bool IsNullOrWhiteSpace(string text) { bool flag; int num = 0; while (true) { if (num >= text.Length) { flag = true; break; } else if (char.IsWhiteSpace(text[num])) { num++; } else { flag = false; break; } } return flag; } private void ScanPast(string text) { int num = _Data.IndexOf(text, _I); if (num <= -1) { _I = _Data.Length; } else { _I = num + text.Length; } } } // Bio-Rad QS400MEPI Recipe: EP_8IN9PT Thu Apr 30 11:29:10 1970 // operator: J batch: BIORAD#2 // cassette: wafer: 52-589368-4445 // -------------------------------------------------------------------------------- // position thickness position thickness position thickness // 1 45.735 2 46.536 3 46.742 // 4 46.015 5 46.648 6 45.366 // 7 46.263 8 46.512 9 46.373 // wafer mean thickness = 46.2433, std. dev = 0.4564 PASS // ================================================================================ // Radial variation (computation B) PASS: // thickness -2.7474