/// <summary> /// Exports the changes file /// </summary> /// <param name="data"></param> /// <param name="filePath"></param> /// <param name="changeMatrixFilePath"></param> /// <param name="changesFilePath"></param> /// <param name="dateColumnFormat"></param> private static void ExportChangesFile(Dataset data, string filePath, string changeMatrixFilePath, string changesFilePath, DateColumnFormat dateColumnFormat) { var changesUsed = new List <int>(); using (var writer = File.CreateText(changeMatrixFilePath)) { writer.WriteLine("Change matrix for file: " + Path.GetFileName(filePath)); var line = dateColumnFormat.Equals(DateColumnFormat.SplitDateColumn) ? "Day,Month,Year,Hours,Minutes" + ',' : "Date,Time" + ','; line = data.Sensors.OrderBy(x => x.SortIndex).Aggregate(line, (current, sensor) => current + (sensor.Name + ",")); line = line.Remove(line.Count() - 2); writer.WriteLine(line); for (var time = data.StartTimeStamp; time <= data.EndTimeStamp; time = time.AddMinutes(data.DataInterval)) { line = dateColumnFormat.Equals(DateColumnFormat.SplitDateColumn) ? time.ToString("dd") + ',' + time.ToString("MM") + ',' + time.ToString("yyyy") + ',' + time.ToString("HH") + ',' + time.ToString("mm") + ',' : time.ToString("dd/MM/yyyy") + ',' + time.ToString("HH:mm") + ','; foreach (var sensor in data.Sensors.OrderBy(x => x.SortIndex)) { LinkedList <int> vals; if (sensor.CurrentState.Changes.TryGetValue(time, out vals)) { changesUsed.AddRange(vals.Where(x => !changesUsed.Contains(x))); line = vals.Aggregate(line, (current, val) => current + (val + " ")); } line += ","; } line = line.Remove(line.Count() - 2); writer.WriteLine(line); } } using (var writer = File.CreateText(changesFilePath)) { writer.WriteLine("Change log for file " + Path.GetFileName(filePath)); foreach (var i in changesUsed.OrderBy(i => i)) { Debug.Print("Change number " + i); writer.WriteLine(i == -1 ? new ChangeReason(-1, "Reason not specified") : ChangeReason.ChangeReasons.FirstOrDefault(x => x.ID == i)); } } }
/// <summary> /// Exports as a CSV /// </summary> /// <param name="data"></param> /// <param name="filePath"></param> /// <param name="includeEmptyLines"></param> /// <param name="dateColumnFormat"></param> /// <param name="exportRaw"></param> /// <param name="numOfPointsToSummarise"></param> private static void ExportCSV(Dataset data, string filePath, bool includeEmptyLines, DateColumnFormat dateColumnFormat, bool exportRaw, int numOfPointsToSummarise) { using (StreamWriter writer = File.CreateText(filePath)) { const char del = '\t'; var columnHeadings = dateColumnFormat.Equals(DateColumnFormat.OneDateColumn) ? "DateTime" : "Date" + del + "Time"; var currentSensorIndex = 0; var outputData = new string[data.Sensors.Count, (data.ExpectedDataPointCount / numOfPointsToSummarise) + 1]; var rowDate = data.StartTimeStamp; foreach (var sensor in data.Sensors.OrderBy(x => x.SortIndex)) { var stateToUse = (exportRaw) ? sensor.RawData : sensor.CurrentState; //Construct the column headings (Sensor siteNames) columnHeadings += del + ConstructHeader(sensor); var i = data.StartTimeStamp; while (i <= data.EndTimeStamp) { var sum = float.MinValue; for (var j = 0; j < numOfPointsToSummarise; j++, i = i.AddMinutes(data.DataInterval)) { float value; if (stateToUse.Values.TryGetValue(i, out value)) if (sum.Equals(float.MinValue)) sum = value; else sum += value; } if (!sum.Equals(float.MinValue)) { if (sensor.SummaryType == SummaryType.Average) outputData[ currentSensorIndex, GetArrayRowFromTime(data, data.StartTimeStamp, i.AddMinutes((-data.DataInterval) * numOfPointsToSummarise), numOfPointsToSummarise)] = Math.Round((sum / numOfPointsToSummarise), 2).ToString(); else outputData[ currentSensorIndex, GetArrayRowFromTime(data, data.StartTimeStamp, i.AddMinutes((-data.DataInterval) * numOfPointsToSummarise), numOfPointsToSummarise)] = Math.Round((sum), 2).ToString(); } } currentSensorIndex++; } //Strip the last delimiter from the headings and write the line writer.WriteLine(columnHeadings); //write the data here... for (int row = 0; row < data.ExpectedDataPointCount / numOfPointsToSummarise; row++) { string line = ""; for (int col = 0; col < data.Sensors.Count; col++) line += del + outputData[col, row]; if (includeEmptyLines || line.Length != data.Sensors.Count) { line = dateColumnFormat.Equals(DateColumnFormat.OneDateColumn) ? rowDate.ToString("yyyy-MM-dd HH:mm") + line : rowDate.ToString("yyyy-MM-dd") + del + rowDate.ToString("HH:mm") + line; writer.WriteLine(line); } rowDate = rowDate.AddMinutes(data.DataInterval * numOfPointsToSummarise); } writer.Close(); } }
/// <summary> /// Exports as a CSV /// </summary> /// <param name="data"></param> /// <param name="filePath"></param> /// <param name="includeEmptyLines"></param> /// <param name="dateColumnFormat"></param> /// <param name="exportRaw"></param> /// <param name="numOfPointsToSummarise"></param> private static void ExportCSV(Dataset data, string filePath, bool includeEmptyLines, DateColumnFormat dateColumnFormat, bool exportRaw, int numOfPointsToSummarise) { using (StreamWriter writer = File.CreateText(filePath)) { const char del = ','; var columnHeadings = dateColumnFormat.Equals(DateColumnFormat.SplitDateColumn) ? "DD" + del + "MM" + del + "YYYY" + del + "hh" + del + "mm" : "DD/MM/YYYY" + del + "hh:mm"; var currentSensorIndex = 0; var outputData = new string[data.Sensors.Count, (data.ExpectedDataPointCount / numOfPointsToSummarise) + 1]; var rowDate = data.StartTimeStamp; foreach (var sensor in data.Sensors.OrderBy(x => x.SortIndex)) { var stateToUse = (exportRaw) ? sensor.RawData : sensor.CurrentState; //Construct the column headings (Sensor names) columnHeadings += del + sensor.Name; var i = data.StartTimeStamp; while (i <= data.EndTimeStamp) { var sum = float.MinValue; for (var j = 0; j < numOfPointsToSummarise; j++, i = i.AddMinutes(data.DataInterval)) { float value; if (stateToUse.Values.TryGetValue(i, out value)) { if (sum.Equals(float.MinValue)) { sum = value; } else { sum += value; } } } if (!sum.Equals(float.MinValue)) { if (sensor.SummaryType == SummaryType.Average) { outputData[ currentSensorIndex, GetArrayRowFromTime(data, data.StartTimeStamp, i.AddMinutes((-data.DataInterval) * numOfPointsToSummarise), numOfPointsToSummarise)] = Math.Round((sum / numOfPointsToSummarise), 2).ToString(); } else { outputData[ currentSensorIndex, GetArrayRowFromTime(data, data.StartTimeStamp, i.AddMinutes((-data.DataInterval) * numOfPointsToSummarise), numOfPointsToSummarise)] = Math.Round((sum), 2).ToString(); } } } currentSensorIndex++; } //Strip the last delimiter from the headings and write the line writer.WriteLine(columnHeadings); //write the data here... for (int row = 0; row < data.ExpectedDataPointCount / numOfPointsToSummarise; row++) { string line = ""; for (int col = 0; col < data.Sensors.Count; col++) { line += del + outputData[col, row]; } if (includeEmptyLines || line.Length != data.Sensors.Count) { line = dateColumnFormat.Equals(DateColumnFormat.SplitDateColumn) ? rowDate.ToString("dd") + del + rowDate.ToString("MM") + del + rowDate.ToString("yyyy") + del + rowDate.ToString("HH") + del + rowDate.ToString("mm") + line : rowDate.ToString("dd/MM/yyyy") + del + rowDate.ToString("HH:mm") + line; writer.WriteLine(line); } rowDate = rowDate.AddMinutes(data.DataInterval * numOfPointsToSummarise); } writer.Close(); } }
/// <summary> /// Exports the changes file /// </summary> /// <param name="data"></param> /// <param name="filePath"></param> /// <param name="changeMatrixFilePath"></param> /// <param name="changesFilePath"></param> /// <param name="dateColumnFormat"></param> private static void ExportChangesFile(Dataset data, string filePath, string changeMatrixFilePath, string changesFilePath, DateColumnFormat dateColumnFormat) { var changesUsed = new List<int>(); using (var writer = File.CreateText(changeMatrixFilePath)) { writer.WriteLine("Change matrix for file: " + Path.GetFileName(filePath)); writer.WriteLine("Cell format: QA/QC value [Raw value] (Change reason number)"); var line = dateColumnFormat.Equals(DateColumnFormat.OneDateColumn) ? "Day,Month,Year,Hours,Minutes" + '\t' : "Date,Time" + '\t'; line = data.Sensors.OrderBy(x => x.SortIndex).Aggregate(line, (current, sensor) => current + (sensor.Name + "\t")); line = line.Remove(line.Count() - 2); writer.WriteLine(line); for (var time = data.StartTimeStamp; time <= data.EndTimeStamp; time = time.AddMinutes(data.DataInterval)) { line = dateColumnFormat.Equals(DateColumnFormat.OneDateColumn) ? time.ToString("yyyy-MM-dd HH:mm") + '\t' : time.ToString("yyyy-MM-dd") + '\t' + time.ToString("HH:mm") + '\t'; foreach (var sensor in data.Sensors.OrderBy(x => x.SortIndex)) { LinkedList<int> vals; float valsRaw; float currentValue; if (sensor.CurrentState.Changes.TryGetValue(time, out vals)) { if (sensor.CurrentState.Values.TryGetValue(time, out currentValue)) { line = line + currentValue + " "; if (sensor.RawData.Values.TryGetValue(time, out valsRaw)) { line = line + "[" + valsRaw + "] ("; } changesUsed.AddRange(vals.Where(x => !changesUsed.Contains(x))); // line = sensor.CurrentState.Values<time>.Values; line = vals.Aggregate(line, (current, val) => current + (val + " ")) + ")"; } } line += "\t"; } line = line.Remove(line.Count() - 2); writer.WriteLine(line); } } using (var writer = File.CreateText(changesFilePath)) { writer.WriteLine("Change log for file " + Path.GetFileName(filePath)); foreach (var i in changesUsed.OrderBy(i => i)) { Debug.Print("Change number " + i); writer.WriteLine(i == -1 ? new ChangeReason(-1, "Reason not specified") : ChangeReason.ChangeReasons.FirstOrDefault(x => x.ID == i)); } } }