/// <summary>
        /// Read an individual line from a CIlib output file
        /// </summary>
        /// <param name="line">The line to be read.</param>
        protected virtual void ReadLine(string line)
        {
            string[] tokens = line.Split(SplitChars, StringSplitOptions.RemoveEmptyEntries);
            if (!int.TryParse(tokens[0], out var iter))
            {
                Console.WriteLine("Iteration is not the first column.");
            }

            string columnName;

            int index = 0;             //the index of the column being parsed

            //loop through each column
            while (index < ColumnArray.Length)
            {
                columnName = ColumnArray[index];

                List <double> values = new List <double>();

                //loop through the various columns (i.e., runs) for this measure
                while (index < ColumnArray.Length && ColumnArray[index] == columnName)
                {
                    values.Add(double.Parse(tokens[index + 1]));                     //add 1 to offset iteration as first column
                    index++;
                }

                IterationStats stats = new IterationStats(iter, values);

                Measurements.AddOrUpdate(columnName,
                                         x => //add function
                {
                    Measurement meas = new Measurement(columnName);
                    meas.AddIterationStatistics(iter, stats);
                    return(meas);
                },
                                         (name, meas) => //update function
                {
                    meas.AddIterationStatistics(iter, stats);
                    return(meas);
                }
                                         );
            }
        }