private static Meter ParseDataSource(DataSourceRecord dataSource) { Meter meter; MeterLocation meterLocation; string name = dataSource.DataSourceName; Guid vendorID = dataSource.VendorID; Guid equipmentID = dataSource.EquipmentID; meter = new Meter(); meter.Name = name; meter.AssetKey = name; meter.ShortName = name.Substring(0, Math.Min(name.Length, 50)); meterLocation = new MeterLocation(); meterLocation.AssetKey = meter.Name; meterLocation.Name = string.Format("{0} location", meter.Name); meterLocation.ShortName = meterLocation.Name.Substring(0, Math.Min(meterLocation.Name.Length, 50)); meterLocation.Description = meterLocation.Name; if (vendorID != Vendor.None) { meter.Make = Vendor.ToString(vendorID); } if (equipmentID != Guid.Empty) { meter.Model = Equipment.ToString(equipmentID); } return(meter); }
/// <summary> /// Parses the file into a meter data set per meter contained in the file. /// </summary> /// <param name="filePath">The path to the file to be parsed.</param> /// <returns>List of meter data sets, one per meter.</returns> public void Parse(string filePath) { DataSourceRecord dataSource = null; ObservationRecord observation; IEnumerable <ChannelInstance> channelInstances; Meter meter = null; Channel channel; DataSeries dataSeries; DateTime[] timeData; while (m_parser.HasNextObservationRecord()) { observation = m_parser.NextObservationRecord(); if ((object)observation.DataSource == null) { continue; } if ((object)dataSource == null) { dataSource = observation.DataSource; meter = ParseDataSource(dataSource); m_meterDataSet.Meter = meter; } if (!AreEquivalent(dataSource, observation.DataSource)) { throw new InvalidDataException($"PQDIF file \"{filePath}\" defines too many data sources."); } channelInstances = observation.ChannelInstances .Where(channelInstance => QuantityType.IsQuantityTypeID(channelInstance.Definition.QuantityTypeID)) .Where(channelInstance => channelInstance.SeriesInstances.Any()) .Where(channelInstance => channelInstance.SeriesInstances[0].Definition.ValueTypeID == SeriesValueType.Time); foreach (ChannelInstance channelInstance in channelInstances) { timeData = ParseTimeData(channelInstance); foreach (SeriesInstance seriesInstance in channelInstance.SeriesInstances.Skip(1)) { channel = ParseSeries(seriesInstance); dataSeries = new DataSeries(); dataSeries.DataPoints = timeData.Zip(ParseValueData(seriesInstance), (time, d) => new DataPoint() { Time = time, Value = d }).ToList(); dataSeries.SeriesInfo = channel.Series[0]; meter.Channels.Add(channel); m_meterDataSet.DataSeries.Add(dataSeries); } } } }
// Static Methods private static bool AreEquivalent(DataSourceRecord dataSource1, DataSourceRecord dataSource2) { if (ReferenceEquals(dataSource1, dataSource2)) { return(true); } if ((object)dataSource1 == null || (object)dataSource2 == null) { return(false); } return(dataSource1.DataSourceName == dataSource2.DataSourceName && dataSource1.VendorID == dataSource2.VendorID && dataSource1.EquipmentID == dataSource2.EquipmentID); }