public Tag GetTagFromCSV(string fileName, TagCSV tagCSV) { Tag tag = new Tag() { TagName = tagCSV.TagName, TagDescription = tagCSV.TagNameRus }; StreamReader fileStream = OpenFile(fileName); string timeStampStr; string valueStr; string fistLine; if (fileStream != null) { fistLine = fileStream.ReadLine(); fistLine = Regex.Replace(fistLine, "[@,%\\.\"'\\\\]", string.Empty); fistLine = fistLine.Replace("-", "_"); fistLine = fistLine.Replace("/", "_"); string[] headerLine = fistLine.Split(';'); //string[] headerLine = fileStream.ReadLine().Split(';'); //TODO: Доработать проверку что в этом есть этот тег if (headerLine[tagCSV.TimeStampColumn].Contains(tagCSV.TagNameRus) && headerLine[tagCSV.ValueColumn].Contains(tagCSV.TagNameRus)) { NumberFormatInfo nfi = new NumberFormatInfo() { NumberDecimalSeparator = "." }; while (fileStream.Peek() > 0) { string[] dataLine = fileStream.ReadLine().Split(';'); if (tagCSV.TimeStampColumn < dataLine.Length - 1 && tagCSV.ValueColumn < dataLine.Length - 1) { timeStampStr = dataLine[tagCSV.TimeStampColumn]; valueStr = dataLine[tagCSV.ValueColumn]; if (!string.IsNullOrEmpty(timeStampStr) && !string.IsNullOrEmpty(valueStr)) { TagValue tagValue = new TagValue(); //tagValue.ValueString = valueStr.Trim(); tagValue.ValueFloat = decimal.Parse(valueStr, NumberStyles.Float, nfi); tagValue.TimeStamp = Convert.ToDateTime(timeStampStr.Trim()); tag.TagValues.Add(tagValue); } } } } fileStream.Close(); } return(tag); }
/// <summary> /// Получения списка Тегов в содержащихся в файле CSV /// </summary> /// <param name="fileName"></param> /// <returns></returns> public List <TagCSV> GetListTagFromCSV(string fileName) { List <TagCSV> retList = new List <TagCSV>(); StreamReader fileStream = OpenFile(fileName); //debug string fistLine; if (fileStream != null) { //char[] charsToTrim = { '%','"', '/', '\'' }; //не удаляет первый символ "\" //fistLine = fileStream.ReadLine().Trim(charsToTrim); fistLine = fileStream.ReadLine(); fistLine = Regex.Replace(fistLine, "[@,%\\.\"'\\\\]", string.Empty); fistLine = fistLine.Replace("-", "_"); fistLine = fistLine.Replace("/", "_"); //s = s.Replace("\"", "") string[] headerLine = fistLine.Split(';'); string ll; //После удаления ковычек стало работать нормально //for (int i = 0; i < headerLine.Length; i++) //{ // ll=headerLine[i].Remove(0, 1); // headerLine[i] = ll; //} //foreach (string line in headerLine) //{ // //Удаляем первый символ который почему-то "\" // ll= line.Remove(0, 1); // line = ll; //} ////string[] headerLine = fileStream.ReadLine().Split(';'); string nameTagTemp; int columnTimeStamp; int columnValue; for (int i = 0; i < headerLine.Length; i++) { if (headerLine[i].IndexOf("Time") != -1) { columnTimeStamp = i; nameTagTemp = headerLine[i].Remove(headerLine[i].IndexOf("Time")).Trim(); for (int j = 0; j < headerLine.Length; j++) { if ((headerLine[j].IndexOf(nameTagTemp) != -1) && (headerLine[j].IndexOf("ValueY") != -1)) { columnValue = j; TagCSV tagCSV = new TagCSV() { TagNameRus = nameTagTemp, TagName = Translit.GetTranslit(nameTagTemp), TimeStampColumn = columnTimeStamp, ValueColumn = columnValue }; retList.Add(tagCSV); } } } } } return(retList); }
/// <summary> /// Создание тега из файлов и фильтрация через указанный промежуток минут /// </summary> /// <param name="fileNames"></param> /// <param name="tagCSV"></param> /// <param name="minuteAvarage">Период минут усреднения</param> /// <returns></returns> public Tag GetTagFromCSV(List <string> fileNames, TagCSV tagCSV, int minuteAvarage, bool avgMode) { Tag tag = new Tag() { TagName = tagCSV.TagName, TagDescription = tagCSV.TagNameRus }; foreach (string fileName in fileNames) { StreamReader fileStream = OpenFile(fileName); string timeStampStr; string valueStr; string fistLine; if (fileStream != null) { fistLine = fileStream.ReadLine(); fistLine = Regex.Replace(fistLine, "[@,%\\.\"'\\\\]", string.Empty); fistLine = fistLine.Replace("-", "_"); fistLine = fistLine.Replace("/", "_"); string[] headerLine = fistLine.Split(';'); //string[] headerLine = fileStream.ReadLine().Split(';'); if (headerLine[tagCSV.TimeStampColumn].Contains(tagCSV.TagNameRus) && headerLine[tagCSV.ValueColumn].Contains(tagCSV.TagNameRus)) { NumberFormatInfo nfi = new NumberFormatInfo() { NumberDecimalSeparator = "." }; while (fileStream.Peek() > 0) { string[] dataLine = fileStream.ReadLine().Split(';'); if (tagCSV.TimeStampColumn < dataLine.Length - 1 && tagCSV.ValueColumn <= dataLine.Length - 1) { timeStampStr = dataLine[tagCSV.TimeStampColumn]; valueStr = dataLine[tagCSV.ValueColumn]; if (!string.IsNullOrEmpty(timeStampStr) && !string.IsNullOrEmpty(valueStr)) { //if (decimal.TryParse(valueStr, NumberStyles.Float, CultureInfo.InvariantCulture, out decimal d)) if (decimal.TryParse(valueStr.Replace(',', '.').Trim(), NumberStyles.Float, nfi, out decimal d)) { TagValue tagValue = new TagValue(); tagValue.ValueFloat = d; tagValue.TimeStamp = Convert.ToDateTime(timeStampStr.Trim()); tag.TagValues.Add(tagValue); } //tagValue.ValueString = valueStr.Trim(); //TagValue tagValue = new TagValue(); //tagValue.ValueFloat = decimal.Parse(valueStr, NumberStyles.Float, nfi); //tagValue.ValueFloat = Convert.ToDecimal(valueStr.Replace('.', ',')); //tagValue.TimeStamp = Convert.ToDateTime(timeStampStr.Trim()); //tag.TagValues.Add(tagValue); } } } } fileStream.Close(); } } List <TagValue> tagValues = new List <TagValue>(); if (avgMode) { var groups = tag.TagValues.OrderBy(k => k.TimeStamp).GroupBy(x => { var stamp = x.TimeStamp; stamp = stamp.AddMinutes(-(stamp.Minute % minuteAvarage)); //instead minuteAvarage was 5 stamp = stamp.AddMilliseconds(-stamp.Millisecond - 1000 * stamp.Second); return(stamp); }) .Select(g => new TagValue { TimeStamp = g.Key, ValueFloat = g.Average(s => s.ValueFloat) }).ToList <TagValue>(); tag.TagValues = groups; } else { var groups = tag.TagValues.OrderBy(k => k.TimeStamp).GroupBy(x => { var stamp = x.TimeStamp; stamp = stamp.AddMinutes(-(stamp.Minute % minuteAvarage)); //instead minuteAvarage was 5 stamp = stamp.AddMilliseconds(-stamp.Millisecond - 1000 * stamp.Second); return(stamp); }) .Select(g => new TagValue { TimeStamp = g.Key, ValueFloat = g.First().ValueFloat }).ToList <TagValue>(); tag.TagValues = groups; } //.Select(g => new TagValue { TimeStamp = g.Key, ValueFloat = g.Average(s =>Convert.ToDecimal(s.ValueString.Replace('.',','))) }).ToList<TagValue>(); // .Select(g => new TagValue { TimeStamp = g.Key, ValueString = g.OrderBy(s=>s.TimeStamp).FirstOrDefault(d=>string.IsNullOrEmpty(d.ValueString)) }).ToList<TagValue>(); //if (zeroOffset) //{ // int minSecond = tag.TagValues.Min(a => a.TimeStamp.Second); // tagValues = tag.TagValues.OrderBy(a => a.TimeStamp).Distinct().First(s=>s.TimeStamp.Year) // tagValues = tag.TagValues.Where(tv => ((tv.TimeStamp.Minute % minuteAvarage == 0) && (tv.TimeStamp.Second- minSecond) == 0) || (tv.TimeStamp.Minute == 0 && (tv.TimeStamp.Second- minSecond) == 0)).OrderBy(tv => tv.TimeStamp).Distinct().Select(tv => tv).ToList<TagValue>(); // tag.TagValues = tagValues; //} //else //{ // tagValues = tag.TagValues.Where(tv => ((tv.TimeStamp.Minute % minuteAvarage == 0) && tv.TimeStamp.Second == 0) || (tv.TimeStamp.Minute == 0 && tv.TimeStamp.Second == 0)).OrderBy(tv => tv.TimeStamp).Select(tv => tv).ToList<TagValue>(); // tag.TagValues = tagValues; //} return(tag); }
public Tag GetTagFromCSV(List <string> fileNames, TagCSV tagCSV) { Tag tag = new Tag() { TagName = tagCSV.TagName, TagDescription = tagCSV.TagNameRus }; foreach (string fileName in fileNames) { StreamReader fileStream = OpenFile(fileName); string timeStampStr; string valueStr; if (fileStream != null) { string[] headerLine = fileStream.ReadLine().Split(';'); if (headerLine[tagCSV.TimeStampColumn].Contains(tagCSV.TagNameRus) && headerLine[tagCSV.ValueColumn].Contains(tagCSV.TagNameRus)) { NumberFormatInfo nfi = new NumberFormatInfo() { NumberDecimalSeparator = "." }; while (fileStream.Peek() > 0) { string[] dataLine = fileStream.ReadLine().Split(';'); if (tagCSV.TimeStampColumn < dataLine.Length - 1 && tagCSV.ValueColumn < dataLine.Length - 1) { timeStampStr = dataLine[tagCSV.TimeStampColumn]; valueStr = dataLine[tagCSV.ValueColumn]; if (!string.IsNullOrEmpty(timeStampStr) && !string.IsNullOrEmpty(valueStr)) { if (decimal.TryParse(valueStr.Replace(',', '.').Trim(), NumberStyles.Float, nfi, out decimal d)) { TagValue tagValue = new TagValue(); tagValue.ValueFloat = d; tagValue.TimeStamp = Convert.ToDateTime(timeStampStr.Trim()); tag.TagValues.Add(tagValue); } //TagValue tagValue = new TagValue(); ////tagValue.ValueString = valueStr.Trim(); //tagValue.ValueFloat = decimal.Parse(valueStr, NumberStyles.Float, nfi); //tagValue.TimeStamp = Convert.ToDateTime(timeStampStr.Trim()); //tag.TagValues.Add(tagValue); } } } } fileStream.Close(); } } List <TagValue> tagValues = new List <TagValue>(); tagValues = tag.TagValues.OrderBy(tv => tv.TimeStamp).Select(tv => tv).ToList <TagValue>(); tag.TagValues = tagValues; return(tag); }