[已解决]:字符串匹配部分字符的那一行的提取操作
本帖最后由 boyhong 于 2012-5-31 15:22 编辑有一个字符串,我想找寻匹配部分的那一行单独取出来。(这个字符串有600行左右,请大家帮忙考虑一下效率,谢谢您多多指点。)
我现在用的是笨办法如下,先写到一个临时文件里去,然后查。能不能不用生成临时文件,直接对字符串进行一个匹配行的提取?谢谢大家。
我的示例代码如下:
$test="1,姓名,帐号,加分项目1,加分项目2,加分项目3,"&@CRLF&"2,张三,zhangsan,4,,2,"&@CRLF&"3,张三2,zhangsan2,1,3,,"&@CRLF&"4,张三3,zhangsan3,,1,2,"&@CRLF&"5,张三4,zhangsan4,,,2,"
MsgBox(0,"要处理的字符串是:",$test)
;将上边的字符串写到一个临时的文件里
FileWrite(@ScriptDir&"\test1.txt",$test)
;要打开的文件
Local $file = FileOpen(@ScriptDir&"\test1.txt", 0)
;建立一个临时文件存货符合条件的结果
Local $jieguo = FileOpen(@ScriptDir&"\jieguo.csv", 2)
;先把第一行的表头写过去
FileWriteLine($jieguo, FileReadLine($file,1))
; 每次读取一行文本,直到文件结束.
While 1
Local $line = FileReadLine($file)
If @error = -1 Then ExitLoop
If StringInStr($line,"zhangsan2") Then
FileWriteLine($jieguo, $line & @CRLF)
EndIf
Wend
FileClose($file)
FileClose($jieguo)
MsgBox(0, "OK", "完事了")
当然,要是将后边带数字的进行一下相加放到最后一行去,那敢情就更完美了~~~
请您多多指点。谢谢大家。 回复 2# boyhong
#include <array.au3>
$test="1,姓名,帐号,加分项目1,加分项目2,加分项目3,"&@CRLF&"2,张三,zhangsan,4,,2,"&@CRLF&"3,张三2,zhangsan2,1,3,,"&@CRLF&"4,张三3,zhangsan3,,1,2,"&@CRLF&"5,张三4,zhangsan4,,,2,"
$test = StringRegExp($test, '.*zhangsan2\D*(\d*)\D*(\d*)\D*', 2)
_ArrayDisplay($test)
相加或相减,自己处理吧. 本帖最后由 afan 于 2012-5-30 21:26 编辑
Local $Str = _
'1,姓名,帐号,加分项目1,加分项目2,加分项目3,' & @CRLF & _
'4,张三3,zhangsan3,,1,2,' & @CRLF & _
'2,张三,zhangsan,4,,2,' & @CRLF & _
'3,张三2,zhangsan2,1,3,,' & @CRLF & _
'5,张三4,zhangsan4,,,2,'
;MsgBox(0, '原字符串', $Str)
Local $sKey = 'zhangsan'
Local $sLine = StringRegExpReplace($Str, '(?si).*?\r\n(\V*,' & $sKey & ',\V*).*', '$1')
Local $sVal = Execute(StringReplace(StringRegExpReplace(StringRegExpReplace($sLine, '.*?(\d*,\d*,\d*,)$', '$1'), ',{2,}|,$', '+0'), ',', '+'))
MsgBox(0, $sKey, $sLine & @CRLF & $sVal) 回复 1# boyhong
楼主看来是没有接触过正则啊!正则对于文本的处理,那是杠杠的,当然要学好正则也不容易,但是简单的使用还是没有问题的,查找正则学习三十分钟的帖子,包你能够很好的解决你的问题,看到2楼的代码了吗?一句正则语句就帮你提取出来了,怎么样?赶紧去学习一下吧,真的很强大的正则。 强大的正则哦 好东西!!!!!!!学习了!谢谢 本帖最后由 netegg 于 2012-5-31 15:38 编辑
不会正则
#include<array.au3>
Local $test="1,姓名,帐号,加分项目1,加分项目2,加分项目3,"&@CRLF&"2,张三,zhangsan,4,,2,"&@CRLF&"3,张三2,zhangsan2,1,3,,"&@CRLF&"4,张三3,zhangsan3,,1,2,"&@CRLF&"5,张三4,zhangsan4,,,2,"
$aA = StringSplit($test, @crlf , 2)
$aB = _arrayfindall($aA, 'zhangsan', 0,0,0,1)
For $i In $aB
$string = $aA[$i]
$ret = stringreplace(StringRight($string , StringLen($string) - StringInStr($string, ',', 0, 3)), ',', '+')
Do
If StringRight($ret, 1) = '+' Then
$ret= StringTrimRight($ret, 1)
EndIf
If StringLeft($ret, 1) = '+' Then
$ret = StringTrimLeft($ret, 1)
EndIf
Until(StringRight($ret, 1) <> '+' AndStringLeft($ret, 1) <>'+')
ConsoleWrite(StringLeft($string, StringInStr($string, ',', 0, 3)) & Execute($ret) & @cr)
next
再给你一个,后面算和的 我的正则解决方法,昨登录不了,今补上吧。$test="1,姓名,帐号,加分项目1,加分项目2,加分项目3,"&@CRLF&"2,张三,zhangsan,4,,2,"&@CRLF&"3,张三2,zhangsan2,1,3,,"&@CRLF&"4,张三3,zhangsan3,,1,2,"&@CRLF&"5,张三4,zhangsan4,,,2,"
MsgBox(0,"要处理的字符串是:",$test)
Local $jieguo = FileOpen(@ScriptDir&"\jieguo.csv", 2)
FileWriteLine($jieguo, "1,姓名,帐号,加分项目1,加分项目2,加分项目3,")
$array=StringRegExp($test,"(.+zhangsan2.+\r)",3)
FileWriteLine($jieguo, $array & @CRLF)
FileClose($jieguo)
MsgBox(0, "OK,完事了", $array)
感谢各位大牛,正则一段时间不拿,就陌生了。。。并且还带恐惧心理。。。
再次感谢,再去复习正则去了。。。
页:
[1]