
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
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