Index: Ringtoets/Piping/src/Ringtoets.Piping.IO/SurfaceLines/PipingSurfaceLinesCsvReader.cs =================================================================== diff -u -r68597fa1a4f4d31ee209873eec139f9412026bd2 -r59ea94f47cbf3b4830b14bf87e3609341785a1df --- Ringtoets/Piping/src/Ringtoets.Piping.IO/SurfaceLines/PipingSurfaceLinesCsvReader.cs (.../PipingSurfaceLinesCsvReader.cs) (revision 68597fa1a4f4d31ee209873eec139f9412026bd2) +++ Ringtoets/Piping/src/Ringtoets.Piping.IO/SurfaceLines/PipingSurfaceLinesCsvReader.cs (.../PipingSurfaceLinesCsvReader.cs) (revision 59ea94f47cbf3b4830b14bf87e3609341785a1df) @@ -65,6 +65,9 @@ private StreamReader fileReader; private int lineNumber; + private int idNameColumnIndex; + private int startGeometryColumnIndex; + /// /// Initializes a new instance of the class /// and opens a given file path. @@ -283,7 +286,7 @@ /// Id value is null or empty. private string GetSurfaceLineName(IList tokenizedString) { - var name = tokenizedString.Any() ? tokenizedString[0].Trim() : string.Empty; + var name = tokenizedString.Any() ? tokenizedString[idNameColumnIndex].Trim() : string.Empty; if (string.IsNullOrEmpty(name)) { throw CreateLineParseException(lineNumber, Resources.PipingSurfaceLinesCsvReader_ReadLine_Line_lacks_ID); @@ -307,7 +310,7 @@ { try { - return tokenizedString.Skip(1) + return tokenizedString.Skip(startGeometryColumnIndex) .Select(ts => Double.Parse(ts, CultureInfo.InvariantCulture)) .ToArray(); } @@ -441,18 +444,45 @@ var tokenizedHeader = header.Split(separator).Select(s => s.Trim().ToLowerInvariant()).ToArray(); // Check for valid id: - if (!acceptableLowerCaseIdNames.Contains(tokenizedHeader[0])) + DetermineIdNameColumnIndex(tokenizedHeader); + + if (idNameColumnIndex == -1) { return false; } // Check for valid 1st coordinate in header: + DetermineStartGeometryColumnIndex(tokenizedHeader); + + if (startGeometryColumnIndex == -1) + { + return false; + } + bool valid = true; for (int i = 0; i < expectedFirstCoordinateHeader.Length && valid; i++) { - valid = tokenizedHeader[1 + i].Equals(expectedFirstCoordinateHeader[i]); + valid = tokenizedHeader[startGeometryColumnIndex + i].Equals(expectedFirstCoordinateHeader[i]); } return valid; } + + private void DetermineStartGeometryColumnIndex(string[] tokenizedHeader) + { + startGeometryColumnIndex = Array.IndexOf(tokenizedHeader, expectedFirstCoordinateHeader[0]); + } + + private void DetermineIdNameColumnIndex(string[] tokenizedHeader) + { + idNameColumnIndex = -1; + foreach (string name in acceptableLowerCaseIdNames) + { + idNameColumnIndex = Array.IndexOf(tokenizedHeader, name); + if (idNameColumnIndex > -1) + { + break; + } + } + } } } \ No newline at end of file Index: Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/SurfaceLines/PipingSurfaceLinesCsvReaderTest.cs =================================================================== diff -u -r68597fa1a4f4d31ee209873eec139f9412026bd2 -r59ea94f47cbf3b4830b14bf87e3609341785a1df --- Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/SurfaceLines/PipingSurfaceLinesCsvReaderTest.cs (.../PipingSurfaceLinesCsvReaderTest.cs) (revision 68597fa1a4f4d31ee209873eec139f9412026bd2) +++ Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/SurfaceLines/PipingSurfaceLinesCsvReaderTest.cs (.../PipingSurfaceLinesCsvReaderTest.cs) (revision 59ea94f47cbf3b4830b14bf87e3609341785a1df) @@ -93,6 +93,22 @@ } [Test] + public void GetSurfaceLinesCount_OpenedValidFileWithHeaderWithOptionalHeadersAndTwoSurfaceLines_ReturnNumberOfSurfaceLines() + { + // Setup + string path = Path.Combine(testDataPath, "TwoValidSurfaceLines_WithOptionalHeaders.csv"); + + using (var reader = new PipingSurfaceLinesCsvReader(path)) + { + // Call + int linesCount = reader.GetSurfaceLinesCount(); + + // Assert + Assert.AreEqual(2, linesCount); + } + } + + [Test] public void GetSurfaceLinesCount_OpenedValidFileWithHeaderAndNoSurfaceLines_ReturnZero() { // Setup @@ -283,6 +299,55 @@ } [Test] + public void DoReadLine_OpenedValidFileWithHeaderAndTwoSurfaceLinesWithOptionalHeaders_ReturnCreatedSurfaceLine() + { + // Setup + string path = Path.Combine(testDataPath, "TwoValidSurfaceLines_WithOptionalHeaders.csv"); + + // Precondition: + Assert.IsTrue(File.Exists(path)); + + using (var reader = new PipingSurfaceLinesCsvReader(path)) + { + // Call + var surfaceLine1 = reader.ReadSurfaceLine(); + var surfaceLine2 = reader.ReadSurfaceLine(); + + // Assert + + #region 1st surfaceline + + Assert.AreEqual("Rotterdam1", surfaceLine1.Name); + Assert.AreEqual(8, surfaceLine1.Points.Count()); + Assert.AreEqual(94263.0026213, surfaceLine1.StartingWorldPoint.X); + Assert.AreEqual(427776.654093, surfaceLine1.StartingWorldPoint.Y); + Assert.AreEqual(-1.02, surfaceLine1.StartingWorldPoint.Z); + Assert.AreEqual(94331.1767309, surfaceLine1.EndingWorldPoint.X); + Assert.AreEqual(427960.112661, surfaceLine1.EndingWorldPoint.Y); + Assert.AreEqual(1.44, surfaceLine1.EndingWorldPoint.Z); + Assert.AreEqual(surfaceLine1.StartingWorldPoint, surfaceLine1.Points.First()); + Assert.AreEqual(surfaceLine1.EndingWorldPoint, surfaceLine1.Points.Last()); + + #endregion + + #region 2nd surfaceline + + Assert.AreEqual("ArtifcialLocal", surfaceLine2.Name); + Assert.AreEqual(3, surfaceLine2.Points.Count()); + Assert.AreEqual(2.3, surfaceLine2.StartingWorldPoint.X); + Assert.AreEqual(0, surfaceLine2.StartingWorldPoint.Y); + Assert.AreEqual(1, surfaceLine2.StartingWorldPoint.Z); + Assert.AreEqual(5.7, surfaceLine2.EndingWorldPoint.X); + Assert.AreEqual(0, surfaceLine2.EndingWorldPoint.Y); + Assert.AreEqual(1.1, surfaceLine2.EndingWorldPoint.Z); + Assert.AreEqual(surfaceLine2.StartingWorldPoint, surfaceLine2.Points.First()); + Assert.AreEqual(surfaceLine2.EndingWorldPoint, surfaceLine2.Points.Last()); + + #endregion + } + } + + [Test] [SetCulture("en-US")] public void ReadLine_OpenedValidFileWithHeaderAndSurfaceLinesWithDuplicatePointsWithCultureEN_ReturnCreatedSurfaceLineWithDuplicatePoints() { Index: Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/test-data/SurfaceLines/TwoValidSurfaceLines_WithOptionalHeaders.csv =================================================================== diff -u --- Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/test-data/SurfaceLines/TwoValidSurfaceLines_WithOptionalHeaders.csv (revision 0) +++ Ringtoets/Piping/test/Ringtoets.Piping.IO.Test/test-data/SurfaceLines/TwoValidSurfaceLines_WithOptionalHeaders.csv (revision 59ea94f47cbf3b4830b14bf87e3609341785a1df) @@ -0,0 +1,3 @@ +Profielnaam;Geologischprofiel;X_GridPoint;Y_GridPoint;ScenarioClusterID;X1;Y1;Z1;...;Xn;Yn;Zn;;;;;;;;;;;;;;;;; +Rotterdam1;1;36.17;0;1;94263.0026213;427776.654093;-1.02;94275.9126686;427811.080886;-1.04;94284.0663827;427831.918156;1.25;94294.9380015;427858.191234;1.45;94305.3566362;427889.900123;1.65;94315.0957947;427913.908281;1.66;94325.0614453;427941.766804;1.55;94331.1767309;427960.112661;1.44 +ArtifcialLocal;1;44.22;0;1;2.3;0;1.0;4.4;0;2.0;5.7;0;1.1;;;;;;;;;;;;;;;