feicuiboy 发表于 2011-3-30 18:10:20

(已解决)在配置文件中设置通用字符,辨别变量和普通字符()

本帖最后由 feicuiboy 于 2011-4-20 22:18 编辑


=============有更新,见37楼 2011.4.19号思路和代码http://autoitx.com/forum.php?mod=redirect&goto=findpost&ptid=23299&pid=291603&fromuid=7643391===============

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


举例说明:

程序中定义变量
$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
$xx=5
Global $xxx = "车外圆{~1:Φ:%$xx-1.5%::0:-0.19~},保持尺寸{~2::%$xx-1.5%::0.5~}"
Global $str = "%"
MsgBox(0,"",_str($xxx, $str))

Func _str($strs, $str) ;"字符串", "子字符串"
Local$str1, $str_tmp,$i_tmp,$str_result
$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=0 Then;如果不存在变指定字符,则返回整个字符
Return $strs
Else
        $str_result=StringLeft( $strs, $str1-1) ;最左边字符串
        $str_total=$str_result
        For $i=1 To $i_tmpStep 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

feicuiboy 发表于 2011-3-30 18:13:49

{:face (270):}回复 1# feicuiboy

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

但是苦于没有例子。。

republican 发表于 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。

afan 发表于 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) Then Return SetError(2, 0, '')
        Return Execute(Eval($sR) & $sR & $sR)
EndFunc   ;==>_Execute

feicuiboy 发表于 2011-3-30 19:30:04

回复 3# republican

    谢谢指导!

afan 发表于 2011-3-30 19:40:12

如果有小数点的数字的话要改下正则Local $sR = StringRegExp($s_ini, '%\$(.+?)%([+-])(\d+(?:\.\d+)?)', 1)

feicuiboy 发表于 2011-3-30 19:52:04

回复 6# afan
正则很强大,需要好好在学学了,以前看了一段,不用就忘记了,还是要多用啊

lxz 发表于 2011-3-31 08:08:27

下载来看看.....

feicuiboy 发表于 2011-3-31 10:51:46

本帖最后由 feicuiboy 于 2011-3-31 11:02 编辑

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


=============================
配置.ini的内容如下:
[零件通用信息]
A3=车外圆Φ%$xx%+0.5,保持尺寸%$xx%-2
[尺寸]
B1=100
B2=200
Dim $xx
Dim $ini="配置.ini"
$xx=IniRead($ini,"尺寸","B1","")
$xx=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) Then Return SetError(2, 0, '')
      Return Execute(Eval($sR) & $sR & $sR)
EndFunc   ;==>_Execute

afan 发表于 2011-3-31 12:04:30

Dim $xx, $ini = "配置.ini"
$xx = IniRead($ini, "尺寸", "B1", "")
$xx = 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) Then Return SetError(2, 0, '')
        Local $tmp = Eval($sR)
        If $x = 1 Then Return Execute($tmp[$sR] & $sR & $sR)
        If UBound($sR) <> 8 Then Return SetError(3, 0, '')
        $tmp = Eval($sR)
        Return Execute($tmp[$sR] & $sR & $sR)
EndFunc   ;==>_Execute

feicuiboy 发表于 2011-3-31 19:07:42

谢谢阿A大的热心帮助,能计算了,但是被正则掉的那些无法显示了,不能输出文字哦

我想显示出http://www.autoitx.com/attachment.php?aid=MTQ4NzV8ODdhOTNhNmV8MTMwMTU2OTM0M3xmMDVhS1JMM3VuWTBEUDVPNG5YYlEvd3JsRlhnRGRYQllSYmtmaVVnbXFOZVIzWQ%3D%3D&noupdate=yes这样的效果,就是在%%之间可以进行变量的计算,其他地方按原样子输出

afan 发表于 2011-3-31 19:37:20

本帖最后由 afan 于 2011-3-31 19:39 编辑

回复 11# feicuiboy


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

我不知道你的具体应用,但我觉得这样的配置文件似乎是给自己找麻烦……

feicuiboy 发表于 2011-3-31 20:01:40

本帖最后由 feicuiboy 于 2011-3-31 20:14 编辑

回复 12# afan

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



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




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

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

republican 发表于 2011-3-31 20:46:23

其实我想问一句,你的INI是自己定义的,还是由第三方软件生成的?

feicuiboy 发表于 2011-3-31 20:59:17

本帖最后由 feicuiboy 于 2011-3-31 21:06 编辑

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

情况是这样子的,我是做零件加工工艺
比如:同样是一个手机,它有大有小,尺寸不一样,但是加工工序基本一样,这一类的加工工艺,我就可以通过在ini文件中配置变量,通过一个可视化的gui界面,输入手机的外形尺寸,软件获取该外形尺寸,结合配置文件就可以完成手机的工艺编制。
页: [1] 2 3
查看完整版本: (已解决)在配置文件中设置通用字符,辨别变量和普通字符()