
Load YAML Files

jjweimer
Here is code to load a folder of YAML files and recast each file in it into a (N, 2) text wave. To make this code backwards compatible with IP8 or below, remove the ListToTextWave conversion and replace the for (fName : YAMList) with an explicit for (ic ...) loop on the list elements. The import_...Folder imports an entire folder. The load_... loads just one file.
Function import_YAMLFolder(string mstr, string vstr, [variable cleanup]) variable nfiles, err string fileFilters = "(*.yml,*.yaml):.yml,.yaml;" string fName, fldrName, fList // open a file in the folder (dialog only) NewPath/O/Q/M=mstr YAMLFolder if (v_flag != 0) return -1 endif // set the file list to import fList = IndexedFile(YAMLFolder,-1,".yml") + IndexedFile(YAMLFolder,-1,".yaml") nfiles = ItemsInList(fList) if (nfiles == 0) return -2 endif // import the files PathInfo YAMLFolder fldrName = CleanUpName(ParseFilePath(0,s_path,":",1,0),0) NewDataFolder/O/S $fldrName wave/T YAMLList = ListToTextWave(fList,";") for (fName : YAMLList) err = load_YAML("",vstr,auto=fName) if (err >= 0) wave/T YAMLWave recast_YAML(YAMLWave) endif endfor // clean up if desired if (!ParamIsDefault(cleanup)) killwaves/Z YAMLWave endif SetDataFolder :: return 0 end Function load_YAML(string mstr, string vstr, [string auto]) variable refNum, slen string fileFilters = "(*.yml,*.yaml):.yml,.yaml;" string fName, line = "" // make storage text wave make/N=(0,2)/T/O YAMLwave YAMLwave = "" // open the file if (ParamIsDefault(auto)) open/R/F=(fileFilters)/M=mstr refNum if (strlen(s_fileName) == 0) return -1 endif else open/R/P=YAMLFolder refNum as auto endif fName = s_fileName // validate the first line FReadLine/Q refnum, line slen = strlen(line) if (slen != 0) if (cmpstr(line[0,slen-3],vstr) != 0) close refNum return -1 endif else close refNum return -1 endif close refNum // load the text wave loadwave/A=YAML/J/K=2/M/V={":","",0,1}/Q fName fName = StringFromList(0,s_wavenames) wave/T yw = $fName if (DimSize(yw,0) != 0) duplicate/O/T yw YAMLwave endif killwaves/Z yw return 0 end Function recast_YAML(wave/T ywave) variable npts = DimSize(ywave,0) string wname duplicate/FREE/T ywave twave // remove tab characters and spaces before + after text twave[][] = TrimString(ReplaceString("\t",twave[p][q],"")) // validate that name exists if (cmpstr(twave[1][0],"name") != 0) return -1 endif // clean up wave first and last blank DeletePoints 0,1, twave if (cmpstr(twave[npts-2][0],"") == 0) DeletePoints (npts-2),1, twave endif // create new text wave wname = CleanUpName(twave[0][1],0) duplicate/O twave, $wname return 0 end

Forum

Support

Gallery
Igor Pro 9
Learn More
Igor XOP Toolkit
Learn More
Igor NIDAQ Tools MX
Learn More
Nice! I did have to make a small change for load_YAML() to find my .yaml files. Your file filter string needs to have no spaces in between the different file extensions, like this:
string fileFilters = "(*.yml,*.yaml):.yml,.yaml;"
April 28, 2025 at 09:56 am - Permalink
Thanks. I've made the fix in the posted code.
April 28, 2025 at 01:00 pm - Permalink