protected override void LoadFromFile(string path)
        {
            var separator = _csvSeparatorSelector.GetCsvSeparator(path);

            //if separator selection dialog was cancelled, abort
            if (!(separator is char separatorCharacter))
            {
                return;
            }

            //we keep a copy of the already loaded sheets, in case the reading fails
            var alreadyLoadedDataSheets = DataSheets.Clone();

            DataSheets.Clear();

            try
            {
                using (var reader = new CsvReaderDisposer(path, separatorCharacter))
                {
                    var csv     = reader.Csv;
                    var headers = csv.GetFieldHeaders();
                    var rows    = new List <List <string> >(headers.Length);

                    var dataSheet = new DataSheet
                    {
                        SheetName = ""
                    };

                    for (var i = 0; i < headers.Length; i++)
                    {
                        dataSheet.AddColumn(headers[i], i);
                    }
                    var currentRow = new string[csv.FieldCount];

                    while (csv.ReadNextRecord())
                    {
                        csv.CopyCurrentRecordTo(currentRow);
                        var rowList = currentRow.ToList();
                        var levels  = getMeasurementLevels(rowList);
                        dataSheet.CalculateColumnDescription(levels);
                        dataSheet.AddRow(rowList);
                    }

                    dataSheet.RemoveEmptyColumns();
                    dataSheet.RemoveEmptyRows();

                    DataSheets.AddSheet(dataSheet);
                }
            }
            catch (Exception e)
            {
                DataSheets.CopySheetsFrom(alreadyLoadedDataSheets);
                _logger.AddError(e.Message);
                throw new InvalidObservedDataFileException(e.Message);
            }
        }
        protected override void LoadFromFile(string path)
        {
            //we keep a copy of the already loaded sheets, in case the reading fails
            var alreadyLoadedDataSheets = DataSheets.Clone();

            DataSheets.Clear();

            try
            {
                var reader = new ExcelReader(path);

                while (reader.MoveToNextSheet())
                {
                    if (!reader.MoveToNextRow())
                    {
                        continue;
                    }

                    var rawSheetData = new DataSheet
                    {
                        SheetName = reader.CurrentSheet.SheetName
                    };
                    var headers = reader.CurrentRow;

                    for (var j = 0; j < headers.Count; j++)
                    {
                        rawSheetData.AddColumn(headers[j], j);
                    }

                    while (reader.MoveToNextRow())
                    {
                        //the first two could even be done only once
                        var levels = reader.GetMeasurementLevels(headers.Count);
                        rawSheetData.CalculateColumnDescription(levels);
                        rawSheetData.AddRow(reader.CurrentRow);
                    }

                    rawSheetData.RemoveEmptyColumns();
                    rawSheetData.RemoveEmptyRows();

                    DataSheets.AddSheet(rawSheetData);
                }
            }
            catch (Exception ex)
            {
                DataSheets.CopySheetsFrom(alreadyLoadedDataSheets);
                _logger.AddError(ex.Message);
                throw new InvalidObservedDataFileException(ex.Message);
            }
        }