找回密码
 加入
搜索
查看: 16845|回复: 38

[效率算法] (已解决)在配置文件中设置通用字符,辨别变量和普通字符()

 火.. [复制链接]
发表于 2011-3-30 18:10:20 | 显示全部楼层 |阅读模式
本帖最后由 feicuiboy 于 2011-4-20 22:18 编辑


=============有更新,见37楼 2011.4.19号思路和代码http://autoitx.com/forum.php?mod ... 3391===============


具体请见下图:请大家讨论


举例说明:

程序中定义变量
$xx=25
$yy==125
$zz==458

p.ini文件内容如下:
[设置]
AA=该列有%$xx%-2个
BB=该条目有%$yy%-5个
CC=该条目有%$zz%-7个

我的意思是设置通用的字符,比如%%,在读取设置下的AA、BB、CC时,%%内的自动转换为变量,AA、BB、CC的结果分别为该列有23个,该条目有120个,该条目有451个,能实现这样的效果吗?大高手支招。














=============2011.4.19号思路和代码===============


(我的思路)
我没有按照正则,用了字符查找函数。因为变量界定符(这里是百分号)出现是成对出现的,截取并 计算第1~2个百分号,第3~4个百分号,第5~6个百分号表达式的值,并连接第1个百分号前,第2~3个百分号,第4~5个百分号,,第6~7个百分号之间的字符串
我编写了下面的代码,

自己提供了新方法,谢谢AFAN
#Include <String.au3>
Global $xx[5]
$xx[1]=5
Global $xxx = "车外圆{~1:Φ:%$xx[1]-1.5%::0:-0.19~},保持尺寸{~2::%$xx[1]-1.5%::0.5~}"
Global $str = "%"
MsgBox(0,"",_str($xxx, $str))

Func _str($strs, $str) ;"字符串", "子字符串" 
Local  $str1[25], $str_tmp,$i_tmp,$str_result[20]
$i_tmp=0
Local $str_total=""
        For $i = 1 To 20  ;读取该段字符串含特定字符的数目
                $str_tmp = StringInStr($strs, $str, 0, $i) ;寻找指定字符的位置
                $str1[$i] = $str_tmp  ;找到第i个字符的位置
                        If $str1[$i] >1 Then ;如果存在第i个字符,则
                                $i_tmp= $i ;总的数目
                        Else
                        EndIf
                        Next
        
If $str1[1]=0 Then  ;如果不存在变指定字符,则返回整个字符
Return $strs
Else 
        $str_result[0]=StringLeft( $strs, $str1[1]-1) ;最左边字符串
        $str_total=$str_result[0]
        For $i=1 To $i_tmp  Step 2 ;对变量进行运算
                 $str_result[$i]=Execute(StringMid($strs,$str1[$i]+1,$str1[$i+1]-$str1[$i]-1))  ;返回 1~2,3~4,5~6表达式的值 ,未完成
                $str_result[$i+1]=StringMid($strs,$str1[$i+1]+1,$str1[$i+2]-$str1[$i+1]-1)
                $str_total&=$str_result[$i]&$str_result[$i+1]
        Next         
        Return         $str_total
EndIf
        EndFunc   ;==>_str

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 2011-3-30 18:13:49 | 显示全部楼层
回复 1# feicuiboy

pusofalse曾经回复:
   ,先用Opt("ExpandVarStrings", 1)设置变量的扩展方式,在Ini文件中的定义应该改为“AA=该列有$xx$-2个”。
在输出时先用正则匹配出算术表达式,再用字符串替换函数配合Execute函数替换成运算结果。这些操作不能在函数嵌套中进行,而是要先把IniRead读取的结果放入一个变量中。

但是苦于没有例子。。
发表于 2011-3-30 18:35:49 | 显示全部楼层
回复 2# feicuiboy

er, 其实就是分清楚,什么时候用字符,什么时候用变量。

正则匹配字符,Execute执行字符语句,为什么不可以?

为什么纠结于某人说过的话呢?Please get to the point, search or done by yourself and you will find it easy。
发表于 2011-3-30 19:11:20 | 显示全部楼层
本帖最后由 afan 于 2011-3-30 19:45 编辑
Local $xx = 25, $yy = 125, $zz = 458
Local $AA = '该列有%$xx%-2个', $BB = '该条目有%$yy%-5个', $CC = '该条目有%$zz%-7个'

MsgBox(0, '', _Execute($AA) & @LF & _Execute($BB) & @LF & _Execute($CC))

Func _Execute($s_ini)
        Local $sR = StringRegExp($s_ini, '%\$(.+?)%([+-])(\d+(?:\.\d+)?)', 1) ;可含小数
        If @error Then Return SetError(1, 0, '')
        If Not IsDeclared($sR[0]) Then Return SetError(2, 0, '')
        Return Execute(Eval($sR[0]) & $sR[1] & $sR[2])
EndFunc   ;==>_Execute

评分

参与人数 1金钱 +50 收起 理由
feicuiboy + 50 谢谢afan,提供很好的思路:正则,我回去测 ...

查看全部评分

 楼主| 发表于 2011-3-30 19:30:04 | 显示全部楼层
回复 3# republican

    谢谢指导!
发表于 2011-3-30 19:40:12 | 显示全部楼层
如果有小数点的数字的话要改下正则
Local $sR = StringRegExp($s_ini, '%\$(.+?)%([+-])(\d+(?:\.\d+)?)', 1)
 楼主| 发表于 2011-3-30 19:52:04 | 显示全部楼层
回复 6# afan
正则很强大,需要好好在学学了,以前看了一段,不用就忘记了,还是要多用啊
发表于 2011-3-31 08:08:27 | 显示全部楼层
下载来看看.....
 楼主| 发表于 2011-3-31 10:51:46 | 显示全部楼层
本帖最后由 feicuiboy 于 2011-3-31 11:02 编辑

下面的代码能不能修改正则输出这样的结果:车外圆Φ100.5,保持尺寸198


=============================
配置.ini的内容如下:
[零件通用信息]
A3=车外圆Φ%$xx[0]%+0.5,保持尺寸%$xx[1]%-2
[尺寸]
B1=100
B2=200
 
Dim $xx[3] 
Dim $ini="配置.ini"
$xx[0]=IniRead($ini,"尺寸","B1","") 
$xx[1]=IniRead($ini,"尺寸","B2","") 
$AA=IniRead($ini,"零件通用信息","A3","") 
MsgBox(0, '', _Execute($AA))
 
Func _Execute($s_ini)
        Local $sR = StringRegExp($s_ini, '%\$(.+?)%([+-])(\d+(?:\.\d+)?)', 1) ;可含小数
        If @error Then Return SetError(1, 0, '')
        If Not IsDeclared($sR[0]) Then Return SetError(2, 0, '')
        Return Execute(Eval($sR[0]) & $sR[1] & $sR[2])
EndFunc   ;==>_Execute

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2011-3-31 12:04:30 | 显示全部楼层
Dim $xx[3], $ini = "配置.ini"
$xx[0] = IniRead($ini, "尺寸", "B1", "")
$xx[1] = IniRead($ini, "尺寸", "B2", "")
$AA = IniRead($ini, "零件通用信息", "A3", "")
MsgBox(0, '', _Execute($AA, 1) & @LF & _Execute($AA, 2))

Func _Execute($s_ini, $x)
        Local $sR = StringRegExp($s_ini, '%\$(.+?)\[(\d+)\]%([+-])(\d+(?:\.\d+)?)', 3)
        If @error Then Return SetError(1, 0, '')
        If Not IsDeclared($sR[0]) Then Return SetError(2, 0, '')
        Local $tmp = Eval($sR[0])
        If $x = 1 Then Return Execute($tmp[$sR[1]] & $sR[2] & $sR[3])
        If UBound($sR) <> 8 Then Return SetError(3, 0, '')
        $tmp = Eval($sR[4])
        Return Execute($tmp[$sR[5]] & $sR[6] & $sR[7])
EndFunc   ;==>_Execute

评分

参与人数 1金钱 +18 收起 理由
feicuiboy + 18 谢谢阿A大的热心帮助,能计算了,但是被正则 ...

查看全部评分

 楼主| 发表于 2011-3-31 19:07:42 | 显示全部楼层
谢谢阿A大的热心帮助,能计算了,但是被正则掉的那些无法显示了,不能输出文字哦

我想显示出这样的效果,就是在%%之间可以进行变量的计算,其他地方按原样子输出
发表于 2011-3-31 19:37:20 | 显示全部楼层
本帖最后由 afan 于 2011-3-31 19:39 编辑

回复 11# feicuiboy


    如果是相同的文字直接加上那几个字不就好了;
   如果文字不同那倒是可以提取一并输出,但必须为相同的格式,如:
文字%$xx[0]%+0.5文字%$xx[1]%-2,不然又得改正则。

我不知道你的具体应用,但我觉得这样的配置文件似乎是给自己找麻烦……
 楼主| 发表于 2011-3-31 20:01:40 | 显示全部楼层
本帖最后由 feicuiboy 于 2011-3-31 20:14 编辑

回复 12# afan

我是想做一个通用的配置文件,然后对同一类型的零件加工数据做简单的计算后,读取后到一个excel中,将excel导入到一个工艺软件中输出加工程序 。



请点击放大看,左边是我的配置.ini文件, 右边是我通过读取ini文件,输出到excel后的结果





比如上面的第一行,我会在配置.ini文件中这样写
【零件程序】
A1=车外圆{~1:Φ:%$xx[0]-1.5%::0:-0.19~},保持尺寸{~2::%$xx[1]-1.5%::0.5~}
然后我通过iniread读取 A1的数据,,msg读取后希望得到的就是:车外圆{~1:Φ:60.5::0:-0.19~},保持尺寸{~2::154::0.5~}

就是仅对%%之间的进行计算,其他保持原样, 不知道是否描述清楚,谢谢A大的耐心帮助

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2011-3-31 20:46:23 | 显示全部楼层
其实我想问一句,你的INI是自己定义的,还是由第三方软件生成的?

评分

参与人数 1金钱 +10 收起 理由
feicuiboy + 10 谢谢关注

查看全部评分

 楼主| 发表于 2011-3-31 20:59:17 | 显示全部楼层
本帖最后由 feicuiboy 于 2011-3-31 21:06 编辑

回复 14# republican
ini是我自己定义的。

情况是这样子的,我是做零件加工工艺
比如:同样是一个手机,它有大有小,尺寸不一样,但是加工工序基本一样,这一类的加工工艺,我就可以通过在ini文件中配置变量,通过一个可视化的gui界面,输入手机的外形尺寸,软件获取该外形尺寸,结合配置文件就可以完成手机的工艺编制。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-20 23:05 , Processed in 0.102070 second(s), 31 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表