/// <summary>
        /// Imports a csv-file into <see cref="CsvModel"/> with the given
        /// lower limits for the activitylevel calculator
        /// </summary>
        /// <param name="file">The absolute filepath to the file to import</param>
        /// <param name="minSedantary">Lower limit for sedantary activity</param>
        /// <param name="minLight">Lower limit for light activity</param>
        /// <param name="minModerate">Lower limit for moderate activity</param>
        /// <param name="minHeavy">Lower limit for heavy activity</param>
        /// <param name="minVeryheavy">Lower limit for very heavy activity</param>
        /// <returns>The imported CsvModel</returns>
        public static CsvModel parse(
            String file,
            int minSedantary,
            int minLight,
            int minModerate,
            int minHeavy,
            int minVeryheavy
            )
        {
            // all available line parsers, ascending priority
            AbstractLineParser[] lineParsers = {
               new SingleEntryLineParser(),
               new DateTimeActivityStepsLineParser(),
               new ActivityUnknownLineParser(),
               new DateTimeActivity3dVMUStepsInclLineParser(),
               new DateTimeActivity2dVMUStepsInclLineParser(),
               new Activity3dVMULineParser(),
               new Activity2dVMULineParser(),
               new NoDate3dActivityStepsLineParser(),
               new DateTime3dActivityStepsLineParser(),
               new DateTimeActivityLineParser(),
               new RExportedLineParser(),
               new RT3LineParser(),
               new RT3SemicolomSepLineParser()
            };

            // the active line parser
            AbstractLineParser activeLineParser = null;

            // prevent locking the file when an exception occures
            using (StreamReader reader = new StreamReader(file))
            {
                String line;

                // we need a buffer to parse the line that is overwritten after testing
                String bufferline = "";

                // as long as we have lines to read but haven't found a valid format
                while ((line = reader.ReadLine()) != null && activeLineParser == null)
                {
                    // iterate over all available line parsers
                    foreach (AbstractLineParser parser in lineParsers)
                    {
                        // this line parser does match the given line
                        if (parser.test(line) == true)
                        {
                            activeLineParser = parser;
                            bufferline = line;
                            break;
                        }
                    }
                }

                // reached eof with no line parser matching
                if(activeLineParser == null)
                {
                    throw new LineparserException("No valid line format found for file " + file);
                }

                Console.WriteLine("Detected lineparser: " + activeLineParser.ToString());

                // construct model with supported values
                CsvModel model = new CsvModel(activeLineParser.SupportedValues);
                // set limits for the activitylevel calculator

                model.ActivityLevelCalculator.MinSedantary = minSedantary;
                model.ActivityLevelCalculator.MinLight = minLight;
                model.ActivityLevelCalculator.MinModerate = minModerate;
                model.ActivityLevelCalculator.MinHeavy = minHeavy;
                model.ActivityLevelCalculator.MinVeryheavy = minVeryheavy;

                // Set filename
                model.AbsoluteFileName = file;
                // Add the two lines consumed by lineparser testing
                model.Add(activeLineParser.parseLine(bufferline));
                model.Add(activeLineParser.parseLine(line));

                //iterate over all remaining lines with
                while((line = reader.ReadLine()) != null)
                {
                    if (line.Trim().Length > 0)
                    {
                        model.Add(activeLineParser.parseLine(line));
                    }
                }

                // finish model
                model.finishParsing();

                return model;
            }
        }