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