Generic header skip
Thomas.Dane
I am working on some general procedures for loading & graphing XY data based on those found in the IgorPro manual. This works well when the data file just consists of two columns however, it does not when there is a header. Using the Load general text dialogue you can "skip block" repeatedly until you get to the data, is it possible to include this operation in a procedure and tell the loader to skip block until two waves are found? Or would I have to go down the Open and FReadLine route?
I could write a series procedures specific to each type of data I have where I explicitly code how to read headers and columns which I have done for when I want to perform analysis etc but it would be nice to have a general load&graph that I can use to have a quick look at any data type.
Any suggests would be most welcome.
Tom
String fileName // Name of file to load or "" to get dialog
String pathName // Name of path or "" to get dialog
Variable index=0
// Load the waves and set the globals
LoadWave/G/A/D/O/P=$pathName fileName
if (V_flag==0) // No waves loaded. Perhaps user canceled.
return -1
elseif (V_flag>2) // loaded more than two columns of data
Do
if ( strlen(StringFromList(index, S_waveNames))==0 ) // No more waves
break
endif
wave TestWave=$(StringFromList(index, S_waveNames))
waveStats/Q TestWave
if (V_npnts<10) // Fewer than 10 pnts - likely header info
Killwaves TestWave
endif
index+=1
While(1)
endif
String sx, sy
if (V_flag > 2)
sx = StringFromList(index-2, S_waveNames) // S_waveNames stays same after waves killed
sy = StringFromList(index-1, S_waveNames)
elseif (V_flag == 2)
sx = StringFromList(0, S_waveNames) // index from
sy = StringFromList(1, S_waveNames)
endif
Wave Wx = $sx // Create wave references.
Wave Wy = $sy
String desiredName = ParseFilePath(3, S_fileName, "\\", 0, 0) // Get prefix for wave names by removing extension from S_fileName
rename Wx $(desiredName+"_x")
rename Wy $(desiredName+"_y")
display Wy vs Wx
// Annotate graph
Textbox/A=LT "Waves loaded from " + S_fileName
return 0 // Signifies success.
End
So far I have tested this on a number of data formats w/ different headers and it works as the LoadWave/G loads all info from the file including the data but stores the header info as waves too. I therefore check the number of pnts in each wave and have arbitrarily defined that if there are fewer than 10 pnts it must be a header. Obviously this runs into problem if you have header info with > 10 pnts or data with < 10 pnts.
Any suggestions?
December 18, 2011 at 09:22 am - Permalink