1樓:匿名使用者
我用pb寫過一個函式,把json串轉成datawindow.
不過只適用於單層次的json,就是描述一個關係表的json.
global type f_json2datawindow from function_object
end type
forward prototypes
global function string f_json2datawindow (string json_file, ref datawindow dw_1)
end prototypes
global function string f_json2datawindow (string json_file, ref datawindow dw_1);string ls_file
ls_file=json_file
//查詢替換全部的回車,避免影響判斷
ls_file=f_replace_string_quotecharacter(ls_file,char(13),' ')
ls_file=f_replace_string_quotecharacter(ls_file,char(10),' ')
//查詢替換全部的tab
ls_file=f_replace_string_quotecharacter(ls_file,char(9),' ')
//濾掉首尾空格
ls_file=trim(ls_file)
if len(ls_file) =0 then
return('!!無資料')
end if
if left(ls_file,1) <>'' then
return('!!請用花括號把全部資料括起來。')
end if
ls_file=mid(ls_file,2,len(ls_file) - 2) //取得花括號裡的部分
//取標題
string ls_title
string ls_parm,ls_clm
string ls_clmname
long n,m,p,q,i
dw_1.reset()
n=f_gettagparm(ls_file,'"',ls_parm)
if n<=2 then
return('!!請用半形雙引號把表單的標題欄括起來')
end if
ls_title=ls_parm[2]
//找之後的冒號
//得先找標題欄結尾 q
p=pos(ls_file,'"'+ls_parm[2]+'"')
q=p+len('"'+ls_parm[2]+'"') - 1
//去掉標題欄
ls_file=right(ls_file,len(ls_file) - q )
//過濾掉空格(標題欄與冒號之間的空格)
ls_file=trim(ls_file)
if left(ls_file,1)<>':' then
return('!!標題欄後應跟著冒號')
end if
//去掉冒號再濾空格再去掉首尾方括號
ls_file=trim(right(ls_file,len(ls_file) - 1))
if left(ls_file,1)<>'[' and right(ls_file,1)<>']' then
return('!!請將資料用方括號括起來')
end if
ls_file=trim(mid(ls_file,2,len(ls_file) - 2))
//得到資料
string ls_data
ls_data = ls_file
//應至少有1行,否則無法獲得欄位名
//第一個應該是左花括號
if left(ls_file,1)<>'',1)
if p>=2 then
else
return('!!第一行資料缺少右花括號「}」做結尾')
end if
//去掉花括號,獲得第1行
ls_file=trim(mid(ls_file,2, p - 2))
//列分解
n=f_gettagparm_quotecharacter(ls_file,',',ls_clm)
if n=0 then
return('!!列數為0')
end if
//各列取得列名
string ls_clmnames
for i= 1 to n
ls_clm[i]=trim(ls_clm[i]) // 去掉收尾空格
m=f_gettagparm_quotecharacter(ls_clm[i],':',ref ls_parm)
if m=0 then
return('!!無法取得第1行第'+string(i)+'列的列名')
end if
ls_parm[1]=trim(ls_parm[1])
ls_clmname[i]=ls_parm[1]
if left(ls_clmname[i],1)='"' then ls_clmname[i] = right(ls_clmname[i],len(ls_clmname[i]) - 1)
if right(ls_clmname[i],1)='"' then ls_clmname[i] = left(ls_clmname[i],len(ls_clmname[i]) - 1)
if pos(ls_clmname[i],'')>=1 or pos(ls_clmname[i],'[')>=1 or pos(ls_clmname[i],']')>=1 &
or pos(ls_clmname[i],',')>=1 or pos(ls_clmname[i],char(9))>=1 then
return('!!第1行第'+string(i)+'列的列名中含有非法的字元')
end if
ls_clmnames = ls_clmnames + '['+ls_clmname[i]+']'
next
//生成資料視窗
string sqlstr
sqlstr='select'
for i= 1 to n
sqlstr=sqlstr +' lpad(~' ~',1000) as "'+ls_clmname[i]+'" ,'
next
sqlstr=left(sqlstr,len(sqlstr) - 1) +' from dual '
if f_gendw(dw_1,sqlstr) <>0 then
return('!!生成資料視窗失敗')
end if
//從ls_data載入資料
long ll_begin ,ll_end
long quote_count
long c,r
long ret
string ls_row
string ls_value
ls_data=trim(ls_data) //過濾首尾空格後,首尾應都是花括號
if left(ls_data,1)<>'',p)
r=1do while p>=1
if q>=1 then
quote_count=f_charcount(mid(ls_data ,ll_begin +1,q - ll_begin - 1),'"') //數花括號之間的雙引號數量
if mod(quote_count,2)=1 then //是奇數,找到的花括號是資料內容,則忽略
q=f_pos_outof_quote(ls_data,'}',q+1)
else
ls_row=trim(mid(ls_data,ll_begin+1,q - ll_begin - 1))
r++c++
dw_1.insertrow(c)
//解析列
n=f_gettagparm_quotecharacter(ls_row,',',ls_clm)
if n=0 then
dw_1.setredraw(true)
return('!!第'+string(c)+'行的列數為0')
end if
//各列取得列名
for i= 1 to n
ls_clm[i]=trim(ls_clm[i]) // 去掉收尾空格
m=f_gettagparm_quotecharacter(ls_clm[i],':',ref ls_parm)
if m=0 then
dw_1.setredraw(true)
return('!!無法取得第'+string(c)+'行第'+string(i)+'列的列名')
end if
ls_parm[1]=trim(ls_parm[1])
ls_clmname[i]=ls_parm[1]
if left(ls_clmname[i],1)='"' then ls_clmname[i] = right(ls_clmname[i],len(ls_clmname[i]) - 1)
if right(ls_clmname[i],1)='"' then ls_clmname[i] = left(ls_clmname[i],len(ls_clmname[i]) - 1)
ls_value[i]=trim(ls_parm[2])
if left(ls_value[i],1)='"' then ls_value[i] = right(ls_value[i],len(ls_value[i]) - 1)
if right(ls_value[i],1)='"' then ls_value[i] = left(ls_value[i],len(ls_value[i]) - 1)
ret=pos(ls_clmnames,'['+ls_clmname[i]+']')
if ret=0 then
dw_1.setredraw(true)
return('!!第'+string(c)+'行第'+string(i)+'列寫入資料視窗時,列名('+ls_clmname[i]+')不存在於第1行')
end if
ret=dw_1.setitem(c,ls_clmname[i],ls_value[i])
if isnull(ret) then
dw_1.setredraw(true)
return('!!第'+string(c)+'行第'+string(i)+'列寫入資料視窗時,引數為空')
elseif ret<>1 then
dw_1.setredraw(true)
return('!!第'+string(c)+'行第'+string(i)+'列寫入資料視窗時,行號或列名('+ls_clmname[i]+')不存在')
end if
next
p=f_pos_outof_quote(ls_data,'',p)
end if
else
dw_1.setredraw(true)
return('!!獲取資料時,第'+string(r)+'行找不到右邊的花括號')
end if
loop
dw_1.setredraw(true)
return(ls_title)
end function
二次函式解析式方法,求二次函式解析式的方法有幾個
二次函式 二次函式解析析常用的有兩種存在形式 一般式和頂點式.1 一般式 由二次函式的定義可知 任何二次函式都可表示為y ax2 bx c a 0 這也是二次函式的常用表現形式,我們稱之為一般式.2 頂點式 二次函式的一般式通過配方法可進行如下變形 y ax2 bx c a x2 a x2 a 由二...
請教吉他按品的方法,請教吉他按品的方法
左手 大姆指要放在琴背中線的地方,有的練習琴琴背有條線,就是放大姆指的位置有時會看到一些人採用電吉他的握法,將琴柄握在掌中,這個在一般的古典或是民謠吉他裡都是不好的,因為用手掌握琴柄時,左手的自由度不足所以要快速的變換琴格時,就會慢個一點。而電吉他柄很細,反而用手掌握會好彈一些。其他的手指應呈一個半...
如何利用各樣的方法將PM2 5源解析
pm2.5 解析傳統離 回線解析與 源解析優缺點傳統離線解析技術主要採用受答體模型中的化學質量平衡模型 cmb 以手工取樣和實驗室分析為基礎。在對固定源 移動源 開放源 餐飲油煙源 生物質燃燒源以及二次粒子的前體物排放源等顆粒物源類調查與識別基礎上,手工採集不同源類的顆粒物以及環境受體中的顆粒物樣品...