| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 412 人关注过本帖
标题:再次求助:如何根据“开支明细”动态生成“开支统计表.dbf”
只看楼主 加入收藏
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:109
帖 子:2335
专家分:4205
注 册:2007-4-27
收藏
得分:0 
以下是引用吹水佬在2025-10-30 15:51:05的发言:不用API函数可能容易理解点SET DEFAULT TO (ADDBS(JUSTPATH(SYS(16))))CREATE CURSOR tt (姓名 C(10),项目 V(10),金额 N(6,2))USE 开支明细表2 ALIAS tb IN 0SELECT tbSCAN    getExpenditureRecord(ALLTRIM(tb.支出明细))ENDSCANcmd="CREATE TABLE 开支统计表 (姓名 C(10)"SELECT DISTINCT 项目 FROM tt INTO CURSOR tmpSCAN  cmd=cmd+","+项目+ " n(5,2)"ENDSCANcmd=cmd + ",合计  n(6,2))"EXECSCRIPT(cmd)SELECT distinct 姓名 FROM tt INTO CURSOR tmpSELECT 开支统计表APPEND FROM  DBF("tmp")INDEX on  姓名 TAG  姓名SELECT ttSET RELATION TO 姓名 INTO "开支统计表"SCAN  replace (tt.项目) WITH tt.金额, 合计 WITH 合计+tt.金额 IN "开支统计表"ENDSCANSELECT * FROM 开支统计表CLOSE TABLES ALL CLEAR ALL RETURNFUNCTION getExpenditureRecord(er)    s = ""    i = 1    len = LEN(er)    DO WHILE i <= len        ch = SUBSTR(er,i,1)        IF ISDIGIT(ch) OR ch=="."            a = VAL(SUBSTR(er,i))            INSERT INTO tt VALUES (tb.姓名, s, a)            s = ""            n = i            DO WHILE ISDIGIT(ch) OR ch=="."                n = n+1                ch = SUBSTR(er,n,1)            ENDDO            i = n        ELSE            s = s+ch            i = i+1        ENDIF    ENDDOENDFUNC


吹版好,您在过程中用了 ISDIGIT(ch) OR ch=="." 判断是否是数字或小数点。 如果要分离的是汉字与字母的混合字符串,那么判断 字母 的函数是什么?麻烦告知一下,谢谢!

只求每天有一丁点儿的进步就可以了
5 天前 08:23
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10827
专家分:43431
注 册:2014-5-20
收藏
得分:0 
回复 21楼 wengjl
ISLEADBYTE()
ISALPHA()
ISLOWER()
ISUPPER()
5 天前 13:55
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:109
帖 子:2335
专家分:4205
注 册:2007-4-27
收藏
得分:0 
以下是引用吹水佬在2025-11-2 13:55:21的发言:

ISLEADBYTE()
ISALPHA()
ISLOWER()
ISUPPER()


感谢吹版的热心回复,谢谢!

只求每天有一丁点儿的进步就可以了
5 天前 17:07
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:109
帖 子:2335
专家分:4205
注 册:2007-4-27
收藏
得分:0 

学习反馈:

    **************************
    * 名称:从汉字与数字的混合字符串中分离数字
    * 问题来源:https://bbs.bc-cn.net/thread-514561-1-1.html
    * 举一反三:稍微修改一下,可以分离汉字中的英文字母;当字符串中有汉字、字母、数字也可以分离了。
    * 时间:2025-11-3
    **************************
    CLEAR
    SET SAFETY off
    SET engi 70
    CLOSE DATABASES
   
    er=[巧克力12.67果汁11.50果冻6.5车费20.09]
    c_zfc=[]
    n_zfc=[]
    s = ""
    i = 1
    lena = LEN(er)
    DO WHILE i <= lena                              &&& 循环到 i > lena 时结束
        ch = SUBSTR(er,i,1)                         &&& 在er上提取第 i 个字节(汉字为双字节的,半个半个取,合并后还是正常的汉字)
        IF ISDIGIT(ch) OR ch=="."                   &&& ISDIGIT(ch)是判断字符表达式(ch)的最左边一个字符是否为数字(0 到 9)。 如果是数字或小数点
            *a = VAL(SUBSTR(er,i))                  &&& 首部的数字转换为数值型,汉字后的数字会忽略不计
            c_zfc=c_zfc+s+[|]                       &&& 将货品名记录到变量中,以 | 分隔。
            s = ""                                  &&& 变量重启(初始化)
            n=i                                     &&& 转换计数变量是的一个很好思维方式
            DO WHILE ISDIGIT(ch) OR ch=="."         &&& 从遇到数字开始,遇到汉字结束
                n=n+1
                ch = SUBSTR(er,n,1)                 &&& 循环时先取得数字,每次覆盖,数字结束时取的是数字后续的汉字的左半个,理解不了,加“? i”观察运行结果后理解了
            ENDDO
            n_zfc=n_zfc+SUBSTR(er,i,n-i)+[|]        &&& 取出数字的字符串到变量中,以 | 分隔。
            i=n
        ELSE
            s = s+ch                                &&& 记录货品名称(半个双字节合并后,还是正常的汉字)
            i = i+1                                 &&& 计数
        ENDIF
    ENDDO
    ? c_zfc            &&& 观察结果
    ? n_zfc
    * 对字符串“c_zfc 、 n_zfc”的再处理,可解决好多问题!
    RETURN
   
   
*!*        判断字母,以下函数有用(收录于此,需要时对上述代码修正修正就能实现需求)
*!*        ISLEADBYTE()    &&& 如果字符表达式第一个字符的首字节是前导字节,则返回“真”(.T.)。
*!*        ISALPHA()       &&& 判断字符表达式的最左边一个字符是否为字母。   返回逻辑值
*!*        ISLOWER()       &&& 判断字符表达式最左边的字符是否为小写字母。   返回逻辑值
*!*        ISUPPER()       &&& 判断字符表达式的首字符是否为大写字母 (A~Z)。返回逻辑值


只求每天有一丁点儿的进步就可以了
3 天前 09:02
yiyanxiyin
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:9
帖 子:309
专家分:2272
注 册:2023-6-29
收藏
得分:0 
可以用正则表达式"([\u4e00-\u9fa5]+)(\d+\.?\d*)"提取出品名和价格, 这个最简单易懂, vfp引入vbscript.regexp即支持正则表达式
3 天前 10:12
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:109
帖 子:2335
专家分:4205
注 册:2007-4-27
收藏
得分:0 
以下是引用yiyanxiyin在2025-11-4 10:12:57的发言:

可以用正则表达式"([\u4e00-\u9fa5]+)(\d+\.?\d*)"提取出品名和价格, 这个最简单易懂, vfp引入vbscript.regexp即支持正则表达式


我不识英文,但很好学,所以但凡学来的,都会注释上中文,便于需要时易读懂和引用。麻烦给一段VFP代码呗,谢谢您啦!

只求每天有一丁点儿的进步就可以了
3 天前 13:26
yiyanxiyin
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:9
帖 子:309
专家分:2272
注 册:2023-6-29
收藏
得分:0 
以下deepseek生成的vba代码在wps的excel中测试没问题:
程序代码:
Sub ExtractItemsAndPrices()
    Dim inputString As String
    Dim regex As Object
    Dim matches As Object
    Dim match As Object
    Dim i As Integer
    
    ' 原始字符串
    inputString = "巧克力12.67果汁11.50果冻6.5车费20.09"
    
    ' 创建正则表达式对象
    Set regex = CreateObject("VBScript.RegExp")
    
    ' 设置正则表达式模式
    ' 匹配:一个或多个中文字符 + 一个或多个数字(可能包含小数点)
    regex.Pattern = "([\u4e00-\u9fa5]+)(\d+\.?\d*)"
    regex.Global = True
    regex.IgnoreCase = True
    
    ' 执行匹配
    Set matches = regex.Execute(inputString)
    
    ' 清除可能存在的旧数据
    Cells.Clear
    
    ' 设置表头
    Range("A1").Value = "品名"
    Range("B1").Value = "价格"
    
    ' 遍历所有匹配项并输出到工作表
    i = 2
    For Each match In matches
        If match.SubMatches.Count >= 2 Then
            Cells(i, 1).Value = match.SubMatches(0)  ' 品名
            Cells(i, 2).Value = CDbl(match.SubMatches(1))  ' 价格(转换为数字)
            i = i + 1
        End If
    Next match
    
    ' 自动调整列宽
    Columns("A:B").AutoFit
    
    ' 显示结果
    MsgBox "成功提取出 " & (i - 2) & " 个商品信息!", vbInformation
End Sub

下面是vfp的代码, 请参考(没有vfp环境, 没测试):
程序代码:
* 使用VBScript.RegExp对象
CLEAR
LOCAL lcString, loRegEx, loMatches, loMatch, i

lcString = "巧克力12.67果汁11.50果冻6.5车费20.09"

TRY
    * 创建正则表达式对象
    loRegEx = CREATEOBJECT("VBScript.RegExp")
    loRegEx.Pattern = "([\u4e00-\u9fa5]+)(\d+\.?\d*)"
    loRegEx.Global = .T.
    loRegEx.IgnoreCase = .T.
    
    loMatches = loRegEx.Execute(lcString)
    
    CREATE CURSOR temp_result (品名 C(20), 价格 N(10,2))
    
    FOR i = 0 TO loMatches.Count - 1
        loMatch = loMatches.Item(i)
        IF loMatch.SubMatches.Count >= 2
            lcName = loMatch.SubMatches(0)
            lnPrice = VAL(loMatch.SubMatches(1))
            INSERT INTO temp_result VALUES (lcName, lnPrice)
        ENDIF
    ENDFOR
    
    BROWSE TITLE "使用正则表达式提取结果"
CATCH
    MESSAGEBOX("正则表达式组件不可用", 16, "错误")
ENDTRY
3 天前 14:30
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:109
帖 子:2335
专家分:4205
注 册:2007-4-27
收藏
得分:0 
测试结果正确!
谢谢,谢谢您!

只求每天有一丁点儿的进步就可以了
3 天前 15:02
快速回复:再次求助:如何根据“开支明细”动态生成“开支统计表.dbf”
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.188860 second(s), 10 queries.
Copyright©2004-2025, BC-CN.NET, All Rights Reserved