/// <summary>
        /// Loads data from fully qualified CSV file
        /// Exceptions are thrown if the column names are wrong
        /// </summary>
        /// <param name="?"></param>
        public void FromCSVFile(CSV_File csv)
        {
            SensorDescriptionFile sdf   = new SensorDescriptionFile();
            CSV_Channel           index = csv.GetIndex();

            if (index == null)
            {
                throw new Exception("File contains no valid data");
            }
            CSV_Channel MD                 = CSVToChannel(csv, "MD");
            CSV_Channel Northing           = CSVToChannel(csv, "Northing");
            CSV_Channel Easting            = CSVToChannel(csv, "Easting");
            CSV_Channel DepthSRD           = CSVToChannel(csv, "Depth SRD");
            CSV_Channel IsActive           = CSVToChannel(csv, "Active");
            CSV_Channel Type               = CSVToChannel(csv, "Type");
            CSV_Channel Gain               = CSVToChannel(csv, "Gain");
            CSV_Channel Sensitivity        = CSVToChannel(csv, "Sensitivity");
            CSV_Channel FullScale          = CSVToChannel(csv, "Full Scale");
            CSV_Channel LowFrequency       = CSVToChannel(csv, "Filter Min");
            CSV_Channel HighFrequency      = CSVToChannel(csv, "Filter Max");
            CSV_Channel iN                 = CSVToChannel(csv, "iN");
            CSV_Channel iE                 = CSVToChannel(csv, "iE");
            CSV_Channel iD                 = CSVToChannel(csv, "iD");
            CSV_Channel Polarization       = CSVToChannel(csv, "Polarity");
            CSV_Channel PStationCorrection = CSVToChannel(csv, "P Static");
            CSV_Channel SStationCorrection = CSVToChannel(csv, "S Static");

            sdf.Metric = !DepthSRD.Unit.ToUpper().Contains("F");
            for (int i = 0; i < index.Data.Count; i++)
            {
                SensorDescription sd = new SensorDescription();
                sd.ChannelNumber      = i + 1;
                sd.MD                 = MD.Data[i];
                sd.Northing           = Northing.Data[i];
                sd.Easting            = Easting.Data[i];
                sd.DepthSRD           = DepthSRD.Data[i];
                sd.IsActive           = IsActive.Data[i] > 0.0;
                sd.Type               = Type.Data[i].ToString("0").PadLeft(5, '0');
                sd.Gain               = Gain.Data[i];
                sd.Sensitivity        = Sensitivity.Data[i];
                sd.FullScale          = FullScale.Data[i];
                sd.LowFrequency       = LowFrequency.Data[i];
                sd.HighFrequency      = HighFrequency.Data[i];
                sd.iN                 = iN.Data[i];
                sd.iE                 = iE.Data[i];
                sd.iD                 = iD.Data[i];
                sd.Polarization       = (Polarization.Data[i] < 0.0) ? -1 : 1;
                sd.PStationCorrection = PStationCorrection.Data[i];
                sd.SStationCorrection = SStationCorrection.Data[i];
                sdf.Sensors.Add(sd);
            }
            if (sdf.Sensors.Count <= 0)
            {
                throw new Exception("CSV file contains no data.");
            }
            this.Sensors.Clear();
            this.Metric  = sdf.Metric;
            this.Sensors = sdf.Sensors;
            m_Modified   = true;
        }
        private void Read()
        {
            FileStream   fs = null;
            StreamReader sr = null;

            try
            {
                fs = File.Open(m_FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
                sr = new StreamReader(fs);
                ReadHeader(sr);
                while (true)
                {
                    string s = sr.ReadLine();
                    if (s == null)
                    {
                        break;
                    }
                    SensorDescription sd = new SensorDescription(s);
                    if (!sd.Valid)
                    {
                        continue;
                    }
                    Sensors.Add(sd);
                }
            }
            catch (Exception)
            {
            }
            finally
            {
                if (sr != null)
                {
                    sr.Close();
                }
                if (fs != null)
                {
                    fs.Close();
                }
            }
        }