From 1018655f8cecf3584e1d19516d87faa18d00c65d Mon Sep 17 00:00:00 2001 From: Alexander Luzgarev Date: Sun, 14 Oct 2018 14:52:52 +0200 Subject: [PATCH] Add support for tables --- MatFileHandler.Tests/MatFileReaderTests.cs | 18 ++++++ MatFileHandler.Tests/test-data/good/table.mat | Bin 0 -> 837 bytes MatFileHandler/TableAdapter.cs | 60 ++++++++++++++++++ 3 files changed, 78 insertions(+) create mode 100644 MatFileHandler.Tests/test-data/good/table.mat create mode 100644 MatFileHandler/TableAdapter.cs diff --git a/MatFileHandler.Tests/MatFileReaderTests.cs b/MatFileHandler.Tests/MatFileReaderTests.cs index b424227..9000225 100755 --- a/MatFileHandler.Tests/MatFileReaderTests.cs +++ b/MatFileHandler.Tests/MatFileReaderTests.cs @@ -326,6 +326,24 @@ namespace MatFileHandler.Tests Assert.That(obj[2]["x"].ConvertToDoubleArray(), Is.EqualTo(new[] { -2.0 })); } + [Test] + public void TestTable() + { + var matFile = GetTests("good")["table"]; + var obj = matFile["table_"].Value as IMatObject; + var table = new TableAdapter(obj); + Assert.That(table.NumberOfRows, Is.EqualTo(3)); + Assert.That(table.NumberOfVariables, Is.EqualTo(2)); + Assert.That(table.Description, Is.EqualTo("Some table")); + Assert.That(table.VariableNames, Is.EqualTo(new[] { "variable1", "variable2" })); + var variable1 = table["variable1"] as ICellArray; + Assert.That((variable1[0] as ICharArray).String, Is.EqualTo("First row")); + Assert.That((variable1[1] as ICharArray).String, Is.EqualTo("Second row")); + Assert.That((variable1[2] as ICharArray).String, Is.EqualTo("Third row")); + var variable2 = table["variable2"]; + Assert.That(variable2.ConvertToDoubleArray(), Is.EqualTo(new[] { 1.0, 3.0, 5.0, 2.0, 4.0, 6.0 })); + } + private static AbstractTestDataFactory GetTests(string factoryName) => new MatTestDataFactory(Path.Combine(TestDirectory, factoryName)); diff --git a/MatFileHandler.Tests/test-data/good/table.mat b/MatFileHandler.Tests/test-data/good/table.mat new file mode 100644 index 0000000000000000000000000000000000000000..20018a47422d70ebd12c6bfd0cc94faa6f4fdb45 GIT binary patch literal 837 zcmeZu4DoSvQZUssQ1EpO(M`+DN!3vZ$Vn_o%P-2cQV4Jk_w+L}(NSSQv0U|3C11kdy1tSAP3k4#>I1*aArmCntU2?4XhYruabN>!16o$>PnDC4_iC^XKo`An=0_>!(=(w%0=+I|O zyqD@UsX3A1!UXmYAOmxlKn89NJD4YIC@|O8$s?$viACtROtsFO9i~BxIQSS{GG45W z-6R%qsw(_j(2-u{`4>L1%2y{U3ec^5X@r)_6wklSbIqqJ4yHNf6deI-d(|$>x-gqEM?XY<8@yp6K z-*xOFULF(b{uX=pSk1wECk%XN+E{MLsU~-z~r9arUmx1)t_m0xj(%Ss+F5^{qWJnUmLjgoSyiIeZpgD)<3yT z?<1?vEIsvWmxT0(5*xWK%X8*+XsF*Zn}7ZN&YnFrew_Z7AFr%_-6q5S;K`>8FRmSU z@jI;fs_kldK7(_UyDa|g%sqU|?#{*iTff|I|5RnY@asL(`|_e6yS_bUFk8Re?z+tR zPm84=Rr*xaT{GXEE+6sR{FC9z3Z-QaCA*IqbxvO}qdQS(dE&9sB{Llv#EWkq7q|Is z68PSvDC~({QkGujtcBOT+-%aAHlCk;efC7UU9^m?U7Z$(&2?`|KjqFRJhAYj zWBOL5n`QAedmT8-?i`=q{-U1Y>DN-H*VVz5{92Eu-HY}-^Xo}|v(5d4&BcMH@xSa1 z3txZmx}SG@9&>orcJV(y{_V0{`1;u&v%UHM%;#PE-`BqU|8pg|FaLuD&wu~^SoE&^ zhGUm^JenW(IR5Lo?l&*@=gs|NBk;fVLHE7o$64Yxo7K*@yQ`T0%g*&D`;J5N`vF6E BgO>mR literal 0 HcmV?d00001 diff --git a/MatFileHandler/TableAdapter.cs b/MatFileHandler/TableAdapter.cs new file mode 100644 index 0000000..0901f66 --- /dev/null +++ b/MatFileHandler/TableAdapter.cs @@ -0,0 +1,60 @@ +using System; +using System.Linq; + +namespace MatFileHandler +{ + public class TableAdapter + { + private readonly IMatObject matObject; + + public TableAdapter(IArray array) + { + matObject = array as IMatObject; + if (matObject?.ClassName != "table") + { + throw new ArgumentException("The object provided is not a table."); + } + var cellArray = matObject["varnames"] as ICellArray; + VariableNames = Enumerable + .Range(0, cellArray.Count) + .Select(i => (cellArray[i] as ICharArray).String) + .ToArray(); + NumberOfVariables = VariableNames.Length; + var props = matObject["props"] as IStructureArray; + Description = (props["Description"] as ICharArray).String; + NumberOfRows = (int) matObject["nrows"].ConvertToDoubleArray()[0]; + var rowNamesArrays = matObject["rownames"] as ICellArray; + RowNames = Enumerable + .Range(0, rowNamesArrays.Count) + .Select(i => (cellArray[i] as ICharArray).String) + .ToArray(); + } + + public int NumberOfRows { get; } + + public string[] RowNames { get; } + + public int NumberOfVariables { get; } + + public string[] VariableNames { get; } + + public IArray this[string variableName] + { + get + { + var maybeIndex = Enumerable.Range(0, VariableNames.Length) + .Where(i => VariableNames[i] == variableName) + .Select(i => (int?)i) + .FirstOrDefault(); + if (!(maybeIndex is int index)) + { + throw new IndexOutOfRangeException($"Variable '{variableName}' not found."); + } + var data = matObject["data"] as ICellArray; + return data[index]; + } + } + + public string Description { get; } + } +}