private bool ReadNextAscii()
{
if ((object)m_fileReaders == null)
{
m_fileReaders = new StreamReader[m_fileStreams.Length];
for (int i = 0; i < m_fileStreams.Length; i++)
m_fileReaders[i] = new StreamReader(m_fileStreams[i]);
}
// Read next line of record values
StreamReader reader = m_fileReaders[m_streamIndex];
string line = reader.ReadLine();
string[] elems = ((object)line != null) ? line.Split(',') : null;
// See if we have reached the end of this file
if ((object)elems == null || elems.Length != m_values.Length + 2)
{
if (reader.EndOfStream)
{
m_streamIndex++;
// There is more to read if there is another file
return m_streamIndex < m_fileStreams.Length && ReadNext();
}
throw new InvalidOperationException("COMTRADE schema does not match number of elements found in ASCII data file.");
}
// Parse row of data
uint sample = uint.Parse(elems[0]);
// Get timestamp of this record
m_timestamp = DateTime.MinValue;
// If sample rates are defined, this is the preferred method for timestamp resolution
if (m_inferTimeFromSampleRates && m_schema.SampleRates.Length > 0)
{
// Find rate for given sample
SampleRate sampleRate = m_schema.SampleRates.LastOrDefault(sr => sample <= sr.EndSample);
if (sampleRate.Rate > 0.0D)
m_timestamp = new DateTime(Ticks.FromSeconds(1.0D / sampleRate.Rate * sample) + m_schema.StartTime.Value);
}
// Fall back on specified microsecond time
if (m_timestamp == DateTime.MinValue)
m_timestamp = new DateTime(Ticks.FromMicroseconds(uint.Parse(elems[1]) * m_schema.TimeFactor) + m_schema.StartTime.Value);
// Parse all record values
for (int i = 0; i < m_values.Length; i++)
{
m_values[i] = double.Parse(elems[i + 2]);
if (i < m_schema.AnalogChannels.Length)
{
m_values[i] *= m_schema.AnalogChannels[i].Multiplier;
m_values[i] += m_schema.AnalogChannels[i].Adder;
}
}
return true;
}