HDF5示例代码

使用HDF5DotNet ,任何人都可以指向我的示例代码,它将打开一个hdf5文件,提取数据集的内容,并将内容打印到标准输出?

到目前为止,我有以下内容:

H5.Open(); var h5 = H5F.open("example.h5", H5F.OpenMode.ACC_RDONLY); var dataset = H5D.open(h5, "/Timings/aaPCBTimes"); var space = H5D.getSpace(dataset); var size = H5S.getSimpleExtentDims(space); 

然后它有点混乱。

我实际上想对数据集的内容进行一些处理,但我认为一旦我转储到标准输出,我就可以从那里开始工作。

更新:我已经破解了这足以解决我自己的问题。 我没有意识到数据集是一个多数组 – 我认为它更像是一个数据库表。 万一有人对此感兴趣,

 double[,] dataArray = new double[size[0], 6]; var wrapArray = new H5Array(dataArray); var dataType = H5D.getType(d); H5D.read(dataset, dataType, wrapArray); Console.WriteLine(dataArray[0, 0]); 

试试这个:

 using System; using HDF5DotNet; namespace CSharpExample1 { class Program { // Function used with static int myFunction(H5GroupId id, string objectName, Object param) { Console.WriteLine("The object name is {0}", objectName); Console.WriteLine("The object parameter is {0}", param); return 0; } static void Main(string[] args) { try { // We will write and read an int array of this length. const int DATA_ARRAY_LENGTH = 12; // Rank is the number of dimensions of the data array. const int RANK = 1; // Create an HDF5 file. // The enumeration type H5F.CreateMode provides only the legal // creation modes. Missing H5Fcreate parameters are provided // with default values. H5FileId fileId = H5F.create("myCSharp.h5", H5F.CreateMode.ACC_TRUNC); // Create a HDF5 group. H5GroupId groupId = H5G.create(fileId, "/cSharpGroup", 0); H5GroupId subGroup = H5G.create(groupId, "mySubGroup", 0); // Demonstrate getObjectInfo ObjectInfo info = H5G.getObjectInfo(fileId, "/cSharpGroup", true); Console.WriteLine("cSharpGroup header size is {0}", info.headerSize); Console.WriteLine("cSharpGroup nlinks is {0}", info.nHardLinks); Console.WriteLine("cSharpGroup fileno is {0} {1}", info.fileNumber[0], info.fileNumber[1]); Console.WriteLine("cSharpGroup objno is {0} {1}", info.objectNumber[0], info.objectNumber[1]); Console.WriteLine("cSharpGroup type is {0}", info.objectType); H5G.close(subGroup); // Prepare to create a data space for writing a 1-dimensional // signed integer array. ulong[] dims = new ulong[RANK]; dims[0] = DATA_ARRAY_LENGTH; // Put descending ramp data in an array so that we can // write it to the file. int[] dset_data = new int[DATA_ARRAY_LENGTH]; for (int i = 0; i < DATA_ARRAY_LENGTH; i++) dset_data[i] = DATA_ARRAY_LENGTH - i; // Create a data space to accommodate our 1-dimensional array. // The resulting H5DataSpaceId will be used to create the // data set. H5DataSpaceId spaceId = H5S.create_simple(RANK, dims); // Create a copy of a standard data type. We will use the // resulting H5DataTypeId to create the data set. We could // have used the HST.H5Type data directly in the call to // H5D.create, but this demonstrates the use of H5T.copy // and the use of a H5DataTypeId in H5D.create. H5DataTypeId typeId = H5T.copy(H5T.H5Type.NATIVE_INT); // Find the size of the type uint typeSize = H5T.getSize(typeId); Console.WriteLine("typeSize is {0}", typeSize); // Set the order to big endian H5T.setOrder(typeId, H5T.Order.BE); // Set the order to little endian H5T.setOrder(typeId, H5T.Order.LE); // Create the data set. H5DataSetId dataSetId = H5D.create(fileId, "/csharpExample", typeId, spaceId); // Write the integer data to the data set. H5D.write(dataSetId, new H5DataTypeId(H5T.H5Type.NATIVE_INT), new H5Array(dset_data)); // If we were writing a single value it might look like this. // int singleValue = 100; // H5D.writeScalar(dataSetId, new H5DataTypeId(H5T.H5Type.NATIVE_INT), // ref singleValue); // Create an integer array to receive the read data. int[] readDataBack = new int[DATA_ARRAY_LENGTH]; // Read the integer data back from the data set H5D.read(dataSetId, new H5DataTypeId(H5T.H5Type.NATIVE_INT), new H5Array(readDataBack)); // Echo the data for(int i=0;i(typeId, "myString", ref x); //H5G.close(groupId); H5GIterateDelegate myDelegate; myDelegate = myFunction; int x = 9; int index = H5G.iterate(fileId, "/cSharpGroup", myDelegate, x, 0); // Reopen the group id to show that we can. groupId = H5G.open(fileId, "/cSharpGroup"); H5G.close(groupId); H5F.close(fileId); // Reopen and reclose the file. H5FileId openId = H5F.open("myCSharp.h5", H5F.OpenMode.ACC_RDONLY); H5F.close(openId); } // This catches all the HDF exception classes. Because each call // generates unique exception, different exception can be handled // separately. For example, to catch open errors we could have used // catch (H5FopenException openException). catch (HDFException e) { Console.WriteLine(e.Message); } Console.WriteLine("Processing complete!"); Console.ReadLine(); } } } 

所以,你的开始很棒。 我已经创建了一些可以帮助你的扩展。 在代码中使用它,您应该能够在面向对象的语言中更有意义,例如(在您的情况下):

 H5.Open(); var h5FileId= H5F.open("example.h5"); double[,] dataArray = h5FileId.Read2DArray("/Timings/aaPCBTimes"); // or more generically... T[,] dataArray = h5FileId.Read2DArray("/Timings/aaPCBTimes"); 

以下是不完整的扩展,我将考虑将它们添加到HDF5Net中……

 public static class HdfExtensions { // thank you http://stackoverflow.com/questions/4133377/splitting-a-string-number-every-nth-character-number public static IEnumerable SplitInParts(this String s, Int32 partLength) { if (s == null) throw new ArgumentNullException("s"); if (partLength <= 0) throw new ArgumentException("Part length has to be positive.", "partLength"); for (var i = 0; i < s.Length; i += partLength) yield return s.Substring(i, Math.Min(partLength, s.Length - i)); } public static T[] Read1DArray(this H5FileId fileId, string dataSetName) { var dataset = H5D.open(fileId, dataSetName); var space = H5D.getSpace(dataset); var dims = H5S.getSimpleExtentDims(space); var dataType = H5D.getType(dataset); if (typeof(T) == typeof(string)) { int stringLength = H5T.getSize(dataType); byte[] buffer = new byte[dims[0] * stringLength]; H5D.read(dataset, dataType, new H5Array(buffer)); string stuff = System.Text.ASCIIEncoding.ASCII.GetString(buffer); return stuff.SplitInParts(stringLength).Select(ss => (T)(object)ss).ToArray(); } T[] dataArray = new T[dims[0]]; var wrapArray = new H5Array(dataArray); H5D.read(dataset, dataType, wrapArray); return dataArray; } public static T[,] Read2DArray(this H5FileId fileId, string dataSetName) { var dataset = H5D.open(fileId, dataSetName); var space = H5D.getSpace(dataset); var dims = H5S.getSimpleExtentDims(space); var dataType = H5D.getType(dataset); if (typeof(T) == typeof(string)) { // this will also need a string hack... } T[,] dataArray = new T[dims[0], dims[1]]; var wrapArray = new H5Array(dataArray); H5D.read(dataset, dataType, wrapArray); return dataArray; } } 

这是一个工作样本:

 using System.Collections.Generic; using System; using System.Linq; using System.Text; using System.Threading.Tasks; using HDF5DotNet; namespace HDF5Test { public class HDFTester { static int myFunction(H5GroupId id, string objectName, Object param) { Console.WriteLine("The object name is {0}", objectName); Console.WriteLine("The object parameter is {0}", param); return 0; } public static void runTest() { try { // We will write and read an int array of this length. const int DATA_ARRAY_LENGTH = 12; // Rank is the number of dimensions of the data array. const int RANK = 1; // Create an HDF5 file. // The enumeration type H5F.CreateMode provides only the legal // creation modes. Missing H5Fcreate parameters are provided // with default values. H5FileId fileId = H5F.create("myCSharp.h5", H5F.CreateMode.ACC_TRUNC); // Create a HDF5 group. H5GroupId groupId = H5G.create(fileId, "/cSharpGroup"); H5GroupId subGroup = H5G.create(groupId, "mySubGroup"); // Demonstrate getObjectInfo ObjectInfo info = H5G.getObjectInfo(fileId, "/cSharpGroup", true); Console.WriteLine("cSharpGroup header size is {0}", info.headerSize); Console.WriteLine("cSharpGroup nlinks is {0}", info.nHardLinks); Console.WriteLine("cSharpGroup fileno is {0} {1}", info.fileNumber[0], info.fileNumber[1]); Console.WriteLine("cSharpGroup objno is {0} {1}", info.objectNumber[0], info.objectNumber[1]); Console.WriteLine("cSharpGroup type is {0}", info.objectType); H5G.close(subGroup); // Prepare to create a data space for writing a 1-dimensional // signed integer array. long[] dims = new long[RANK]; dims[0] = DATA_ARRAY_LENGTH; // Put descending ramp data in an array so that we can // write it to the file. int[] dset_data = new int[DATA_ARRAY_LENGTH]; for (int i = 0; i < DATA_ARRAY_LENGTH; i++) dset_data[i] = DATA_ARRAY_LENGTH - i; // Create a data space to accommodate our 1-dimensional array. // The resulting H5DataSpaceId will be used to create the // data set. H5DataSpaceId spaceId = H5S.create_simple(RANK, dims); // Create a copy of a standard data type. We will use the // resulting H5DataTypeId to create the data set. We could // have used the HST.H5Type data directly in the call to // H5D.create, but this demonstrates the use of H5T.copy // and the use of a H5DataTypeId in H5D.create. H5DataTypeId typeId = H5T.copy(H5T.H5Type.NATIVE_INT); // Find the size of the type int typeSize = H5T.getSize(typeId); Console.WriteLine("typeSize is {0}", typeSize); // Set the order to big endian H5T.setOrder(typeId, H5T.Order.BE); // Set the order to little endian H5T.setOrder(typeId, H5T.Order.LE); // Create the data set. H5DataSetId dataSetId = H5D.create(fileId, "/csharpExample", typeId, spaceId); // Write the integer data to the data set. H5D.write(dataSetId, new H5DataTypeId(H5T.H5Type.NATIVE_INT), new H5Array(dset_data)); // If we were writing a single value it might look like this. // int singleValue = 100; // H5D.writeScalar(dataSetId, new H5DataTypeId(H5T.H5Type.NATIVE_INT), // ref singleValue); // Create an integer array to receive the read data. int[] readDataBack = new int[DATA_ARRAY_LENGTH]; // Read the integer data back from the data set H5D.read(dataSetId, new H5DataTypeId(H5T.H5Type.NATIVE_INT), new H5Array(readDataBack)); // Echo the data for (int i = 0; i < DATA_ARRAY_LENGTH; i++) { Console.WriteLine(readDataBack[i]); } // Close all the open resources. H5D.close(dataSetId); // Reopen and close the data sets to show that we can. dataSetId = H5D.open(fileId, "/csharpExample"); H5D.close(dataSetId); dataSetId = H5D.open(groupId, "/csharpExample"); H5D.close(dataSetId); H5S.close(spaceId); H5T.close(typeId); H5G.close(groupId); //int x = 10; //H5T.enumInsert(typeId, "myString", ref x); //H5G.close(groupId); H5GIterateCallback myDelegate; myDelegate = myFunction; int x = 9; int start = 0; int index = H5G.iterate(fileId, "/cSharpGroup",myDelegate, x, ref start); // Reopen the group id to show that we can. groupId = H5G.open(fileId, "/cSharpGroup"); H5G.close(groupId); H5F.close(fileId); // Reopen and reclose the file. H5FileId openId = H5F.open("myCSharp.h5", H5F.OpenMode.ACC_RDONLY); H5F.close(openId); } // This catches all the HDF exception classes. Because each call // generates unique exception, different exception can be handled // separately. For example, to catch open errors we could have used // catch (H5FopenException openException). catch (HDFException e) { Console.WriteLine(e.Message); } Console.WriteLine("Processing complete!"); Console.ReadLine(); } } }