Skip to content

Commit 4f851df

Browse files
committed
[feat] support YAML format, add loadyaml and saveyaml
1 parent bdbd77b commit 4f851df

File tree

6 files changed

+940
-4
lines changed

6 files changed

+940
-4
lines changed

loadjd.m

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
% *.json,.jnii,.jdt,.jmsh,.jnirs,.jbids: JSON/JData based data files, see https://neurojson.org/jdata/draft2
1616
% *.bjd,.bnii,.jdb,.bmsh,.bnirs,.pmat: binary JData (BJData) files, see https://neurojson.org/bjdata/draft2
1717
% *.ubj: UBJSON-encoded files, see http://ubjson.org
18+
% *.yaml: YAML files, see https://yaml.org/
1819
% *.msgpack: MessagePack-encoded files, see http://msgpack.org
1920
% *.h5,.hdf5,.snirf,.nwb: HDF5 files, see https://www.hdfgroup.org/
2021
% *.nii,.nii.gz: NIfTI files, need http://github.com/NeuroJSON/jnifty
@@ -53,6 +54,8 @@
5354
[varargout{1:nargout}] = loadbj(filename, varargin{:});
5455
elseif (regexpi(filename, '\.ubj$'))
5556
[varargout{1:nargout}] = loadubjson(filename, varargin{:});
57+
elseif (regexpi(filename, '\.yaml$'))
58+
[varargout{1:nargout}] = loadyaml(filename, varargin{:});
5659
elseif (regexpi(filename, '\.msgpack$'))
5760
[varargout{1:nargout}] = loadmsgpack(filename, varargin{:});
5861
elseif (regexpi(filename, '\.h5$|\.hdf5$|\.snirf$|\.nwb$'))
@@ -77,6 +80,6 @@
7780
elseif (regexpi(filename, '\.mat$|\.bvec$|\.bval$'))
7881
[varargout{1:nargout}] = load(filename, varargin{:});
7982
else
80-
warning('only support parsing .json,.jnii,.jdt,.jmsh,.jnirs,.jbids,.bjd,.bnii,.jdb,.bmsh,.bnirs,.ubj,.msgpack,.h5,.hdf5,.snirf,.pmat,.nwb,.nii,.nii.gz,.tsv,.tsv.gz,.csv,.csv.gz,.mat,.bvec,.bval; load unparsed raw data');
83+
warning('only support parsing .json,.jnii,.jdt,.jmsh,.jnirs,.jbids,.bjd,.bnii,.jdb,.bmsh,.bnirs,.ubj,.yaml,.msgpack,.h5,.hdf5,.snirf,.pmat,.nwb,.nii,.nii.gz,.tsv,.tsv.gz,.csv,.csv.gz,.mat,.bvec,.bval; load unparsed raw data');
8184
[varargout{1:nargout}] = fileread(filename);
8285
end

loadyaml.m

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
function [data, mmap] = loadyaml(fname, varargin)
2+
%
3+
% data=loadyaml(fname,opt)
4+
% or
5+
% [data, mmap]=loadyaml(fname,'param1',value1,'param2',value2,...)
6+
%
7+
% parse a YAML (YAML Ain't Markup Language) file or string and return a
8+
% matlab data structure with optional memory-map (mmap) table
9+
%
10+
% authors:Qianqian Fang (q.fang <at> neu.edu)
11+
% created on 2025/01/01
12+
%
13+
% input:
14+
% fname: input file name; if fname contains valid YAML syntax,
15+
% fname will be interpreted as a YAML string
16+
% opt: same options as loadjson (see loadjson help for details)
17+
% All loadjson options are supported through yaml2json conversion
18+
%
19+
% output:
20+
% dat: a cell array or struct converted from YAML
21+
% mmap: (optional) memory-mapping table (see loadjson documentation)
22+
%
23+
% examples:
24+
% dat=loadyaml('name: value')
25+
% dat=loadyaml(['examples' filesep 'example.yaml'])
26+
% [dat, mmap]=loadyaml('config.yaml','SimplifyCell',0)
27+
%
28+
% license:
29+
% BSD or GPL version 3, see LICENSE_{BSD,GPLv3}.txt files for details
30+
%
31+
% -- this function is part of JSONLab toolbox (http://iso2mesh.sf.net/cgi-bin/index.cgi?jsonlab)
32+
%
33+
34+
opt = varargin2struct(varargin{:});
35+
webopt = jsonopt('WebOptions', {}, opt);
36+
37+
% Read YAML input (file, URL, or string)
38+
if (regexpi(fname, '^\s*(http|https|ftp|file)://'))
39+
yamlstring = urlread(fname, webopt{:});
40+
elseif (exist(fname, 'file'))
41+
try
42+
encoding = jsonopt('Encoding', '', opt);
43+
if (isempty(encoding))
44+
yamlstring = fileread(fname);
45+
else
46+
fid = fopen(fname, 'r', 'n', encoding);
47+
yamlstring = fread(fid, '*char')';
48+
fclose(fid);
49+
end
50+
catch
51+
try
52+
yamlstring = urlread(fname, webopt{:});
53+
catch
54+
yamlstring = urlread(['file://', fullfile(pwd, fname)]);
55+
end
56+
end
57+
else
58+
% Assume it's a YAML string
59+
yamlstring = fname;
60+
end
61+
62+
if (jsonopt('Raw', 0, opt))
63+
data = yamlstring;
64+
if (nargout > 1)
65+
mmap = {};
66+
end
67+
return
68+
end
69+
70+
% Convert YAML to JSON
71+
jsonstring = yaml2json(yamlstring);
72+
73+
% Use loadjson to parse the converted JSON
74+
if (nargout > 1)
75+
[data, mmap] = loadjson(jsonstring, varargin{:});
76+
else
77+
data = loadjson(jsonstring, varargin{:});
78+
end

savejd.m

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
% *.json,.jnii,.jdt,.jmsh,.jnirs,.jbids: JSON/JData based data files, see https://neurojson.org/jdata/draft2
2424
% *.bjd,.bnii,.jdb,.bmsh,.bnirs,.pmat: binary JData (BJData) files, see https://neurojson.org/bjdata/draft2
2525
% *.ubj: UBJSON-encoded files, see http://ubjson.org
26+
% *.yaml: YAML files, see https://yaml.org/
2627
% *.msgpack: MessagePack-encoded files, see http://msgpack.org
2728
% *.h5,.hdf5,.snirf: HDF5 files, see https://www.hdfgroup.org/
2829
% opt: (optional) for JSON/JData files, these are optional 'param',value pairs
@@ -70,11 +71,13 @@
7071
[varargout{1:nargout}] = savebj(varargin{:});
7172
elseif (regexpi(filename, '\.ubj$'))
7273
[varargout{1:nargout}] = saveubjson(varargin{:});
74+
elseif (regexpi(filename, '\.yaml$'))
75+
[varargout{1:nargout}] = saveyaml(varargin{:});
7376
elseif (regexpi(filename, '\.msgpack$'))
7477
[varargout{1:nargout}] = savemsgpack(varargin{:});
7578
elseif (regexpi(filename, '\.h5$|\.hdf5$|\.snirf$'))
7679
if (~exist('saveh5', 'file'))
77-
error('you must first install EasyH5 from http://github.com/NeuroJSON/easyh5/');
80+
error('you must first install EasyH5 from https://github.com/NeuroJSON/easyh5/');
7881
end
7982
if (~isfield(opt, 'rootname'))
8083
if (nargin >= 3 && ischar(varargin{1}))
@@ -85,5 +88,5 @@
8588
end
8689
[varargout{1:nargout}] = saveh5(varargin{2}, filename, opt);
8790
else
88-
error('file suffix must be one of .json,.jnii,.jdt,.jmsh,.jnirs,.jbids,.bjd,.bnii,.jdb,.bmsh,.bnirs,.ubj,.msgpack,.h5,.hdf5,.snirf,.pmat');
91+
error('file suffix must be one of .json,.jnii,.jdt,.jmsh,.jnirs,.jbids,.bjd,.bnii,.jdb,.bmsh,.bnirs,.ubj,.yaml,.msgpack,.h5,.hdf5,.snirf,.pmat');
8992
end

0 commit comments

Comments
 (0)