Index: src/Deltares.DSoilModel.Data/SosSoilProfilesImporter.cs =================================================================== diff -u -r262 -r283 --- src/Deltares.DSoilModel.Data/SosSoilProfilesImporter.cs (.../SosSoilProfilesImporter.cs) (revision 262) +++ src/Deltares.DSoilModel.Data/SosSoilProfilesImporter.cs (.../SosSoilProfilesImporter.cs) (revision 283) @@ -56,6 +56,13 @@ "remark", "extra" }; + string[] requiredHeaders = new string[] + { + "soilprofile_id", + "top_level", + "soil_name" + }; + // The definition of the csv contains one extra column (soil_type) which is now optional. // Next to that 5 extra optional columns are added for the SOS-import of which one (named extra) is unused for now // So number of columns may vary from 3 to 9. @@ -64,6 +71,18 @@ string csvHeaderError = LocalizationManager.GetTranslatedText(this, "csvHeaderError"); throw new CsvImporterSoilProfilesException(String.Format("{0} : {1}", fileName, csvHeaderError)); } + + //Check that all required column names are present + var missingNames = GetMissingSoilProfileHeaders(headers, requiredHeaders); + if (missingNames != "") + { + string csvHeaderError = LocalizationManager.GetTranslatedText(this, "csvHeaderMissingColumns"); + string csvNotImported = LocalizationManager.GetTranslatedText(this, "csvNotImported"); + LogManager.Messages.Add(new LogMessage(LogMessageType.Error, this, String.Format("{0} : {1} -- {2}", fileName, csvHeaderError, missingNames))); + LogManager.Messages.Add(new LogMessage(LogMessageType.Warning, this, String.Format("{0} : {1}", fileName, csvNotImported))); + return; + } + //Check that all column names are known var invalidNames = GetInvalidSoilProfileHeaders(headers, validHeaders); if (invalidNames != "") @@ -302,5 +321,34 @@ } return invalidHeaders; } + + private string GetMissingSoilProfileHeaders(string[] headers, string[] requiredHeaders) + { + string missingHeaders = ""; + foreach (var name in requiredHeaders) + { + bool found = false; + foreach (var header in headers) + { + if (name.Equals(header)) + { + found = true; + break; + } + } + if (!found) + { + if (missingHeaders == "") + { + missingHeaders = name; + } + else + { + missingHeaders = missingHeaders + ", " + name; + } + } + } + return missingHeaders; + } } } \ No newline at end of file Index: src/Deltares.DSoilModel.Tests/TestFiles/DSoilModelsoilprofilesWithInvalidHeaders.csv =================================================================== diff -u -r262 -r283 --- src/Deltares.DSoilModel.Tests/TestFiles/DSoilModelsoilprofilesWithInvalidHeaders.csv (.../DSoilModelsoilprofilesWithInvalidHeaders.csv) (revision 262) +++ src/Deltares.DSoilModel.Tests/TestFiles/DSoilModelsoilprofilesWithInvalidHeaders.csv (.../DSoilModelsoilprofilesWithInvalidHeaders.csv) (revision 283) @@ -1,4 +1,4 @@ -soilprofile_id;top_level;Soil_name;soiltype +soilprofile_id;top_level;soil_name;soiltype 10Z_286_STBI;33;ZAND;zand 10Z_286_STBI;-11.5;ZAND;Zand 10Z_311_STBI;60;VEEN;Veen Index: src/Deltares.DSoilModel.Tests/TestFiles/DSoilModelsoilprofilesWithMissingHeaders.csv =================================================================== diff -u --- src/Deltares.DSoilModel.Tests/TestFiles/DSoilModelsoilprofilesWithMissingHeaders.csv (revision 0) +++ src/Deltares.DSoilModel.Tests/TestFiles/DSoilModelsoilprofilesWithMissingHeaders.csv (revision 283) @@ -0,0 +1,8 @@ +soilprofile_id;extra;soil_name;soil_type +10Z_286_STBI;33;ZAND;zand +10Z_286_STBI;-11.5;ZAND;Zand +10Z_311_STBI;60;VEEN;Veen +10Z_311_STBI;-3.2;VEEN;Zand +10Z_327_STBI;60;kLEI (0);Veen +10Z_400_STBI;60;WL_zanD;Veen +10Z_400_STBI;-0.9;wl_zand;Veen Index: src/Deltares.DSoilModel.Tests/Deltares.DSoilModel.Tests.csproj =================================================================== diff -u -r263 -r283 --- src/Deltares.DSoilModel.Tests/Deltares.DSoilModel.Tests.csproj (.../Deltares.DSoilModel.Tests.csproj) (revision 263) +++ src/Deltares.DSoilModel.Tests/Deltares.DSoilModel.Tests.csproj (.../Deltares.DSoilModel.Tests.csproj) (revision 283) @@ -127,6 +127,9 @@ Always + + PreserveNewest + PreserveNewest Index: src/Deltares.DSoilModel.Data/Translations.xml =================================================================== diff -u -r262 -r283 --- src/Deltares.DSoilModel.Data/Translations.xml (.../Translations.xml) (revision 262) +++ src/Deltares.DSoilModel.Data/Translations.xml (.../Translations.xml) (revision 283) @@ -25,7 +25,9 @@ - + + + Index: src/Deltares.DSoilModel.Tests/SosSoilProfilesImporterTests.cs =================================================================== diff -u -r262 -r283 --- src/Deltares.DSoilModel.Tests/SosSoilProfilesImporterTests.cs (.../SosSoilProfilesImporterTests.cs) (revision 262) +++ src/Deltares.DSoilModel.Tests/SosSoilProfilesImporterTests.cs (.../SosSoilProfilesImporterTests.cs) (revision 283) @@ -244,5 +244,22 @@ Assert.AreNotEqual(0,project.SoilProfiles1D.Count, "Expected the profiles were read anyway"); } } + + [Test] + public void DSoilModelIO_ImportFromCsvFileWithMissingHeaders() + { + const string csvFileNameAndRelativePath = @"TestFiles\DSoilModelsoilprofilesWithMissingHeaders.csv"; + + // Locate the test files. + var currentDirectory = Directory.GetCurrentDirectory(); + var csvFullFileName = Path.Combine(currentDirectory, csvFileNameAndRelativePath); + LogManager.Messages.Clear(); + using (var project = new DSoilModelProject()) + { + project.ReadSoilProfiles1DFromFile(csvFullFileName); + Assert.AreEqual(2, LogManager.Messages.Count, "Expected two messages"); + Assert.AreEqual(0, project.SoilProfiles1D.Count, "Expected the profiles were not read"); + } + } } } \ No newline at end of file