這是一個園長學習VFP(Visual Foxpro)的Blog歡迎同好一起來參與

星期三, 5月 26, 2010

CSV IMPORT PART II

EXAMPLE:
aa=[abc,"22""Taxi",hello kitty,",","ord"]
?chk_csvfld(aa)

Result:
5

afld[1]=”abc”
afld[2]=”22”Taxi”
afld[3]=”hello kitty”
afld[4]=”,”
afld[5]=”ord”

*green 2010/5/26
FUNCTION chk_csvfld
Lparameters p_str
LOCAL fldnum
*if start is not " then find ,
*if start is " then find ",
*依傳入之字串分解欄位,傳回欄位數
fldnum=0
*Start ....
p_str=ALLTRIM(p_str) &&去除前後空白
is_end=.F.
DO WHILE !is_end
    *->由左向右找
    *         1         2
    *12345678901234567890
    *This,is,a,Book   
    *"This","is","a","book"
    fld_end=IIF(LEFT(p_str,1)='"','"','')+"," &&欄位結尾 若第一個字為["],則欄位結尾為[",] 若為空白,則為[,]
    endpos=ATC(fld_end,p_str) &&注意,第一個字元不可包含在serach裏,以免重覆找到同一組字元,例如[",",Orz]應得3,但會得1
    IF endpos=1 &&若找到第一個,則往下找第2個
        endpos=ATC(fld_end,p_str,2)
    ENDIF
    *
    IF endpos=0 &&找不到啦-表示為最後一欄  
        wfld=SUBSTR(p_str,LEN(fld_end),len(p_str)-len(fld_end)+(2-len(fld_end))) 
        p_str=''
        is_end=.T.   
    ELSE
        wfld=SUBSTR(p_str,LEN(fld_end),endpos-LEN(fld_end))
        p_str=SUBSTR(p_str,endpos+LEN(fld_end))   
    ENDIF
    fldnum=fldnum+1
    DIMENSION afld[fldnum]
    afld[fldnum]=STRTRAN(wfld,[""],["])    &&置換Escape String [""] -> ["]   
ENDDO
*
RETURN fldnum
ENDFUNC

*2010/5/26 by Green

PS:
本示範函式可正確轉換約98%的CSV檔

若您需要100%CSV轉檔程式,可洽我的email:greencwi@gmail.com,可轉MSSQL,DBF…等
當然這部分是需要費用的,謝謝您

沒有留言: