Hélio,
OK so the following works…kind of. I do not believe you can affect the dataset from within a function. So set up as a time series needs to be handled outside
 of the functions. It might be better to return a bundle rather than a series?
Logan
function series get_series_BSL(string dataname)
    set echo off
    set messages off
    string bslurl = "http://api.bls.gov/publicAPI/v1/timeseries/data/"~dataname
    string s = readfile(bslurl)
    sprintf q "\""
    sprintf sq "\'"
    sprintf nl "\n"
    s = strsub(s,q,"")
    s = strsub(s,"{year:",nl)
    s = strsub(s," ","")
    s = strsub(s,"[","")
    s = strsub(s,"{","")
    s = strsub(s,"]","")
    s = strsub(s,"}","")
    s = strsub(s,"'","")
    s = strsub(s,":",",")
    s = strsub(s,",period,","")
    s = strsub(s,","," ")
    s = strsub(s,"seriesID","obs blank blank blank ")
    bundle dt
    scalar i = 1
    string line
    scalar lcount = 0
    string obs1 = null
    string obs2 = null
    loop while getline(s, line)
        temp = strsplit(line,1)~","~strsplit(line,5)
        if i > 2
            sprintf ii "%d", i-2
            dt.@ii = temp
            temp = dt[@ii]
            lcount ++
        endif
        i++
    endloop
    outfile test.csv --write
    printf "%s\n", dt[1]
    loop for (j = lcount; j>1; j--) --quiet     
        printf "%s\n", dt[$j]
    endloop
    outfile test.csv --close
   
    s = readfile("test.csv")
    s = strsub(s,","," ")
   
    i = 1
    scalar jj = 1
    string sPD = ""   
    matrix value = zeros(lcount-1,1)
    loop while getline(s, line)
        if i > 1
            obs1 = (i=2) ? strsplit(line,1) : obs1 
            obs2 = strsplit(line,1)
            sPD = (strstr(obs1,"M")!="") ? "M13" : "Q5"
            if strstr(obs2,sPD)=""
                value[i-1] = atof(strsplit(line,2))
            endif
        endif
        i = strstr(obs2,sPD)="" ? i+1 : i
        jj++
    endloop
    value = trimr(value,0,jj-i)
    print value
    pd = (strstr(obs1,"M")!="") ? 12 : (strstr(obs1,"Q")!="") ? 4 : 1
    obs1 = (pd=12) ? strsub(obs1, "M", ":") : strsub(obs1, "Q", ":")
    obs2 = (pd=12) ? strsub(obs2, "M", ":") : strsub(obs2, "Q", ":")
    print obs1
    print obs2
   
    setobs pd @obs1 --time-series #no effect outside the function
    smpl @obs1 @obs2 #no effect outside the function
    series @dataname = value
    delete dt
    return @dataname
end function
set echo off
set messages off
clear
nulldata 36
test = get_series_BSL("LAUCN040010000000005")
From: gretl-devel-bounces@lists.wfu.edu [mailto:gretl-devel-bounces@lists.wfu.edu]
On Behalf Of Hélio Guilherme
Sent: Wednesday, April 23, 2014 4:31 PM
To: Gretl development
Subject: Re: [Gretl-devel] New function for retrieving data from BLS
Hi Logan,
Tried to make a function, but got stuck on append.
function void get_series_BSL(string dataname)
set echo off
set messages off
string bslurl = "http://api.bls.gov/publicAPI/v1/timeseries/data/"~dataname
string s = readfile(bslurl)
sprintf q "\""
sprintf sq "\'"
sprintf nl "\n"
s = strsub(s,q,"")
s = strsub(s,"{year:",nl)
s = strsub(s," ","")
s = strsub(s,"[","")
s = strsub(s,"{","")
s = strsub(s,"]","")
s = strsub(s,"}","")
s = strsub(s,"'","")
s = strsub(s,":",",")
s = strsub(s,",period,","")
s = strsub(s,","," ")
s = strsub(s,"seriesID","obs blank blank blank ")
bundle dt
scalar i = 1
string line
scalar lcount = 0
loop while getline(s, line)
    temp = strsplit(line,1)~","~strsplit(line,5)
    if i > 2
        sprintf ii "%d", i-2
        dt.@ii = temp
        temp = dt[@ii]
        lcount ++
    endif
    i++
endloop
outfile test.csv --write
printf "%s\n", dt[1]
loop for (j = lcount; j>1; j--)
    printf "%s\n", dt[$j]
endloop
outfile test.csv --close
delete dt
append test.csv  #It fails here because is inside function
end function
set echo off
set messages off
clear
get_series_BSL("LAUCN040010000000005")
On Wed, Apr 23, 2014 at 8:24 PM, Logan Kelly <logan.kelly@uwrf.edu> wrote:
Ok. As promised, the code is not pretty, but here is a start at parsing a bls api call for a single series, which is what the current readfile() function can handle. It works but I can foresee the code being rather fragile.
Logan
clear
set echo off
string s = readfile("http://api.bls.gov/publicAPI/v1/timeseries/data/LAUCN040010000000005")
sprintf q "\""
sprintf sq "\'"
sprintf nl "\n"
s = strsub(s,q,"")
s = strsub(s,"{year:",nl)
s = strsub(s," ","")
s = strsub(s,"[","")
s = strsub(s,"{","")
s = strsub(s,"]","")
s = strsub(s,"}","")
s = strsub(s,"'","")
s = strsub(s,":",",")
s = strsub(s,",period,","")
s = strsub(s,","," ")
s = strsub(s,"seriesID","obs blank blank blank ")
bundle dt
scalar i = 1
string line
scalar lcount = 0
loop while getline(s, line)
    temp = strsplit(line,1)~","~strsplit(line,5)
    if i > 2
        sprintf ii "%d", i-2
        dt.@ii = temp
        temp = dt[@ii]
        lcount ++
    endif
    i++
endloop
outfile test.csv --write
printf "%s\n", dt[1]
loop for (j = lcount; j>1; j--)
    printf "%s\n", dt[$j]
endloop
outfile test.csv --close
append test.csv
_______________________________________________
Gretl-devel mailing list
Gretl-devel@lists.wfu.edu
http://lists.wfu.edu/mailman/listinfo/gretl-devel