Duplicate error: expected wave name
Marta
I have written a procedure in which I would like to automatically load some data from .csv files, concatenate them and sort the data using the first wave as a key. The problem is that the following function execution error appears: "While executing Duplicate, the following error occurred: expected wave name". I have recently started programming in Igor and do not know where the mistake is.
Thanks in advance, I would really appreciate any help you could provide!
Please find attached two .csv files as an example (Jan2015.zip).
Here is the procedure:
#pragma rtGlobals=1 // Use modern global access method.
//----------------- Menu Code -----------------
Menu "Intensidad Trafico Loader"
"Intensidad Trafico Loader", TraficoLoader()
End
Function TraficoLoader()
// This function should load files (with the edning ".csv") from the Intensidad Trafico Ayto. Madrid
string fileList, tempfile
variable iFile, numFile
NewPath /M="Choose folder containing Intensidad Trafico Data files (ending '.csv')" RawDataPath
// Index Directory
fileList = IndexedFile(RawDataPath, -1, ".csv")
print fileList
numFile = itemsinlist(fileList)
if(datafolderexists("Intensidad_Trafico"))
setdatafolder Intensidad_Trafico
else
newdatafolder /S Intensidad_Trafico
endif
For(iFile=0; iFile < numFile; iFile+=1)
tempfile = stringfromlist(iFile, FileList)
TraficoLoadDataFiles(tempfile)
Endfor
End function
// -------------------------- -------------------------- -------------------------- --------------------------
Function TraficoLoadDataFiles(tempfile)
string tempfile
string ListOfWaves, WaveNm, NewNames
variable numWaves, iWave
// Names for the waves in the file
NewNames = "idelem;fecha;identif;tipo_elem;tipo;intensidad;"
NewNames += "ocupacion;carga;vmed;error;periodo_integracion;"
if(!waveexists(idelem))
LoadWave/J/D/A/W/B="C=1; F=8; F=-2; C=1; F=-2; C=1; C=1; C=1; C=1; F=-2; C=1;"/V={";","",1,0}/P=RawDataPath tempfile
//rename the waves
ListOfWaves = WaveList("wave*",";","")
NumWaves = ItemsInList(NewNames)
For(iWave=0; iWave<NumWaves; iWave+=1)
wave wv1 = $stringfromlist(iWave, ListOfWaves)
duplicate /O wv1 $stringfromlist(iWave, NewNames)
killwaves /Z $stringfromlist(iWave, ListOfWaves)
Endfor
setdatafolder Intensidad_Trafico
// If waves already exist, load into temp folder, then concatenate and delete folder
else
newdatafolder /O/S temp
LoadWave/J/D/A/W/B="C=1; F=8; F=-2; C=1; F=-2; C=1; C=1; C=1; C=1; F=-2; C=1;"/V={";","",1,0}/P=RawDataPath tempfile
//rename the waves
ListOfWaves = WaveList("wave*",";","")
NumWaves = ItemsInList(NewNames)
For(iWave=0; iWave<NumWaves; iWave+=1)
wave wv1 = $stringfromlist(iWave, ListOfWaves)
duplicate /O wv1 $stringfromlist(iWave, NewNames)
killwaves /Z $stringfromlist(iWave, ListOfWaves)
Endfor
// Concatenate the waves
numWaves = itemsinlist(NewNames)
For(iWave=0; iWave < NumWaves; iWave +=1)
WaveNm = stringfromlist(iWave, NewNames)
wave TmpWv1 = $WaveNm
wave TmpWv2 = ::$WaveNm
concatenate {TmpWv1}, TmpWv2
Endfor
setdatafolder Intensidad_Trafico
killdatafolder /Z temp
// Sortwaves
wave TempWv = $"idelem"
Make /O/N=(numpnts(TempWv)) SortKey
MakeIndex TempWv, SortKey
for(iWave=0; iWave < numWaves; iWave +=1)
WaveNm = stringfromlist(iWave, NewNames)
wave TmpWv1 = $WaveNm
IndexSort SortKey TmpWv1
endfor
killwaves /Z SortKey
setdatafolder Intensidad_Trafico
endif
End function
//----------------- Menu Code -----------------
Menu "Intensidad Trafico Loader"
"Intensidad Trafico Loader", TraficoLoader()
End
Function TraficoLoader()
// This function should load files (with the edning ".csv") from the Intensidad Trafico Ayto. Madrid
string fileList, tempfile
variable iFile, numFile
NewPath /M="Choose folder containing Intensidad Trafico Data files (ending '.csv')" RawDataPath
// Index Directory
fileList = IndexedFile(RawDataPath, -1, ".csv")
print fileList
numFile = itemsinlist(fileList)
if(datafolderexists("Intensidad_Trafico"))
setdatafolder Intensidad_Trafico
else
newdatafolder /S Intensidad_Trafico
endif
For(iFile=0; iFile < numFile; iFile+=1)
tempfile = stringfromlist(iFile, FileList)
TraficoLoadDataFiles(tempfile)
Endfor
End function
// -------------------------- -------------------------- -------------------------- --------------------------
Function TraficoLoadDataFiles(tempfile)
string tempfile
string ListOfWaves, WaveNm, NewNames
variable numWaves, iWave
// Names for the waves in the file
NewNames = "idelem;fecha;identif;tipo_elem;tipo;intensidad;"
NewNames += "ocupacion;carga;vmed;error;periodo_integracion;"
if(!waveexists(idelem))
LoadWave/J/D/A/W/B="C=1; F=8; F=-2; C=1; F=-2; C=1; C=1; C=1; C=1; F=-2; C=1;"/V={";","",1,0}/P=RawDataPath tempfile
//rename the waves
ListOfWaves = WaveList("wave*",";","")
NumWaves = ItemsInList(NewNames)
For(iWave=0; iWave<NumWaves; iWave+=1)
wave wv1 = $stringfromlist(iWave, ListOfWaves)
duplicate /O wv1 $stringfromlist(iWave, NewNames)
killwaves /Z $stringfromlist(iWave, ListOfWaves)
Endfor
setdatafolder Intensidad_Trafico
// If waves already exist, load into temp folder, then concatenate and delete folder
else
newdatafolder /O/S temp
LoadWave/J/D/A/W/B="C=1; F=8; F=-2; C=1; F=-2; C=1; C=1; C=1; C=1; F=-2; C=1;"/V={";","",1,0}/P=RawDataPath tempfile
//rename the waves
ListOfWaves = WaveList("wave*",";","")
NumWaves = ItemsInList(NewNames)
For(iWave=0; iWave<NumWaves; iWave+=1)
wave wv1 = $stringfromlist(iWave, ListOfWaves)
duplicate /O wv1 $stringfromlist(iWave, NewNames)
killwaves /Z $stringfromlist(iWave, ListOfWaves)
Endfor
// Concatenate the waves
numWaves = itemsinlist(NewNames)
For(iWave=0; iWave < NumWaves; iWave +=1)
WaveNm = stringfromlist(iWave, NewNames)
wave TmpWv1 = $WaveNm
wave TmpWv2 = ::$WaveNm
concatenate {TmpWv1}, TmpWv2
Endfor
setdatafolder Intensidad_Trafico
killdatafolder /Z temp
// Sortwaves
wave TempWv = $"idelem"
Make /O/N=(numpnts(TempWv)) SortKey
MakeIndex TempWv, SortKey
for(iWave=0; iWave < numWaves; iWave +=1)
WaveNm = stringfromlist(iWave, NewNames)
wave TmpWv1 = $WaveNm
IndexSort SortKey TmpWv1
endfor
killwaves /Z SortKey
setdatafolder Intensidad_Trafico
endif
End function
the flags you use with LoadWave already assign names to your waves and thus
ListOfWaves = WaveList("wave*",";","")
stores an empty string in ListOfWaves.
Right-click in your code and turn on "enable debugger" and "debug on error". It will jump to the code causing trouble during run-time.
As a specific solution I would suggest that you check if "ListOfWaves" is empty and only run the renaming code in this case.
As a coarse method you could use
If (StrLen(ListOfWaves))
or
If (ItemsinList(ListOfWaves)>0)
or even someting like
If (ItemsinList(ListOfWaves)==NumOfExpectedItems)
(plus EndIf's)
HJ
February 26, 2015 at 01:44 am - Permalink
February 26, 2015 at 03:31 am - Permalink
John Weeks
WaveMetrics, Inc.
support@wavemetrics.com
February 26, 2015 at 11:32 am - Permalink
February 27, 2015 at 12:18 am - Permalink