回 帖 发 新 帖 刷新版面

主题:請教如何這樣截取字段?

我有一個日漢檔案,裡面exp 域既有日文,也有中文,如:
“中文【日文】,中文【日文】中文”
“【日文】中文,中文【日文】中文”
總之,日文都在"【】"之間,位置不固定,數量也不固定

我現在想將中日文拆開,將所有日文都抽出來,放入 jap 域;所有中文也抽出來,放入 Han 域。我寫了一段代碼,但離效果相差甚遠,希望大家指點一二,這是我的代碼:

Clear All
Select A
Use Jhdict
Go Top
Scan For "["$exp And "]"$exp
    Wait Window Str(Recno('Jhdict'))+"/"+Str(Reccount('Jhdict')) Nowait
    Han=""
    Jap=""
    For i=1 To N
        If  Substrc(Alltrim(exp), i, 1)#"["
            Loop
        Else
            Han=Han-Substrc(Alltrim(exp), 1, i-1)
            Jap=Jap-Substrc(Alltrim(exp), i,Atc("]",exp)-i)
            Exit
        Endif
    Endfor
    Replace Jap With jap, Han With han
Endscan

回复列表 (共8个回复)

沙发

你好,很想为你解答..不过我还是不太理解-.-

是不是想把exp字段中 如exp字段内容为“啊是的【HJK】,的发个【YYY】的发个经过”

存在Jap : HJKYYY

存在Han :啊是的,的发个的发个经过

是这样么? 还有上面HJK跟YYY需要啥符号分割不?

晚点再回来看看=。=~~

不重复回帖了-。-~~先工作先..晚点写给你.

板凳

呵呵,這么快就有高手來指點,先謝謝了
我還在埋頭研究呢,忘了刷新網頁,不好意思
是的,就是你理解的那樣,不過我要將日文依然用【】括起來,有幾個日文,就要有幾個【】,這樣也方便日後進一步編輯。
也就是要處理成
Jap 域應該是:【HJK】【YYY】
Han 域應該是:啊是的,的发个的发个经过

3 楼

FUNCTION gcGetSS
*-- tcStr传入检测字符串  传入类型为C
*-- tlruntype传入检测类型
*-- 例子: "啊是的【HJK】,的发个【YYY】的发个经过" 
*-- gcGetSS("啊是的【HJK】,的发个【YYY】的发个经过",0) 返回  啊是的,的发个的发个经过
*-- gcGetSS("啊是的【HJK】,的发个【YYY】的发个经过",1) 返回  【HJK】,【YYY】
LPARAMETER tcStr,tlSearchType
IF ISNULL(tcStr) 
    RETURN ''
ENDIF 

IF PARAMETERS()<2
   tlSearchType=0
ENDIF
LOCAL lc执行类型,c返回中文,c返回日文
lc执行类型=.F.
c返回中文=''
c返回日文=''
IF ATC('【',tcStr)=0
   RETURN IIF(tlSearchType=0,tcStr,'')
ENDIF    

FOR i=1 To lenc(tcStr)
    lcChr=Substrc(tcStr,i,1)
    IF lcChr='【'
        lc执行类型=.T.
    ENDIF
                
    IF lc执行类型
        c返回日文=c返回日文+Substrc(tcStr,i,1)
    ELSE
        c返回中文=c返回中文+Substrc(tcStr,i,1)
    ENDIF
            
    IF lcChr='】'
        lc执行类型=.F.
    ENDIF
ENDFOR
RETURN IIF(tlSearchType=0,c返回中文,c返回日文)

随便写个参数,可能没啥效率-。- 你试下吧
里面很多代码可以删除,不过大多是为了检测函数完全性

?gcGetSS("啊是的【HJK】,的发个【YYY】的发个经过",0)
?gcGetSS("啊是的【HJK】,的发个【YYY】的发个经过",1)

4 楼

你上面的那个可以直接改成
Clear All
Select A
Use Jhdict
Go Top
Scan 
    Wait Window Str(Recno('exp'))+"/"+Str(Reccount('exp')) Nowait
    Replace Han With gcGetSS(exp),;
            Jap With gcGetSS(exp,1)
Endscan

5 楼

先评分,再拜读!

6 楼

另外如果不想用函数调用,你的代码也可以改为,我自己没测试-,- 可能有些手误会出错 你自己测试下
*-----------------------------------------------------------------------------
Clear All
Select A
Use Jhdict
Go Top
LOCAL lc执行类型,c返回中文,c返回日文,lcChr
Scan For 
    Wait Window Str(Recno('exp'))+"/"+Str(Reccount('exp')) Nowait
    
    IF ATC('【',tcStr)=0
       Replace Jap With '', Han With exp
       loop
    ENDIF
        
    lc执行类型=.F.
    c返回中文=''
    c返回日文=''    
    For i=1 To lenc(tcStr)
        lcChr=Substrc(cStr,i,1)
        IF lcChr='【'
            lc执行类型=.T.
        ENDIF    
            
        IF lc执行类型
            c返回日文=c返回日文+Substrc(cStr,i,1)
        ELSE
            c返回中文=c返回中文+Substrc(cStr,i,1)
        ENDIF
                
        IF lcChr='】'
            lc执行类型=.F.
        ENDIF
    Endfor
    Replace Jap With c返回日文, Han With c返回中文
Endscan
*-----------------------------------------------------------------------------

7 楼

嗯,结果完全正确,这就是我想要的,谢谢你的帮忙!感觉自己差距太大了,我只能处理一个日文词组,如果一句中出现两个以上的,就不会了,想的我头疼。

8 楼

总有一个过程的..多解决实际中遇到的问题,会慢慢进步的。。。一起加油哈-。-

其实实现的原理很简单。。

就是对要检测的字符逐个遍历

遇到>>【 就把他跟后面的加在 c返回日文这个变量后面, 直至遇到】为止
其他情况就就把他赋于 c返回中文

我来回复

您尚未登录,请登录后再回复。点此登录或注册