22
33import h5py
44import numpy as np
5+ from h5py ._hl .group import Group as HDF5Group
56
67from sasdata import dataset_types
78from sasdata .dataset_types import DatasetType
@@ -21,7 +22,7 @@ def __init__(
2122 self .name = name
2223 # validate data contents
2324 if not all ([key in dataset_type .optional or key in dataset_type .required for key in data_contents ]):
24- raise ValueError ("Columns don't match the dataset type" )
25+ raise ValueError (f "Columns don't match the dataset type: { [ key for key in data_contents ] } " )
2526 self ._data_contents = data_contents
2627 self ._verbose = verbose
2728
@@ -103,13 +104,27 @@ def from_json(obj):
103104 metadata = Metadata .from_json (obj ["metadata" ]),
104105 )
105106
106- def save_h5 (self , path : str | typing . BinaryIO ):
107+ def _save_h5 (self , sasentry : HDF5Group ):
107108 """Export data into HDF5 file"""
109+ sasentry .attrs ["name" ] = self .name
110+ self .metadata .as_h5 (sasentry )
111+
112+ # We export each data set into its own entry, so we only ever
113+ # need sasdata01
114+ group = sasentry .create_group ("sasdata01" )
115+ for idx , (key , sasdata ) in enumerate (self ._data_contents .items ()):
116+ sasdata .as_h5 (group , key )
117+
118+
119+ @staticmethod
120+ def save_h5 (data : dict [str , typing .Self ], path : str | typing .BinaryIO ):
108121 with h5py .File (path , "w" ) as f :
109- f .attrs ["name" ] = self .name
110- for idx , (key , entry ) in enumerate (self ._data_contents .items ()):
111- group = f .create_group (f"sasentry{ idx :02d} " )
112- self .metadata .as_h5 (group )
122+ for idx , (key , data ) in enumerate (data .items ()):
123+ sasentry = f .create_group (f"sasentry{ idx + 1 :02d} " )
124+ if not key .startswith ("sasentry" ):
125+ sasentry .attrs ["sasview_key" ] = key
126+ data ._save_h5 (sasentry )
127+
113128
114129
115130class SasDataEncoder (MetadataEncoder ):
@@ -125,7 +140,7 @@ def default(self, obj):
125140 case SasData ():
126141 return {
127142 "name" : obj .name ,
128- "data_contents" : {} ,
143+ "data_contents" : obj . _data_contents ,
129144 "type" : obj .dataset_type ,
130145 "mask" : obj .mask ,
131146 "metadata" : obj .metadata ,
0 commit comments