找回密码
 加入
搜索
查看: 6245|回复: 11

[系统综合] [已解决]:字符串匹配部分字符的那一行的提取操作

  [复制链接]
发表于 2012-5-30 11:08:36 | 显示全部楼层 |阅读模式
本帖最后由 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", "完事了")
 楼主| 发表于 2012-5-30 11:10:25 | 显示全部楼层
当然,要是将后边带数字的进行一下相加放到最后一行去,那敢情就更完美了~~~
请您多多指点。谢谢大家。
发表于 2012-5-30 18:23:04 | 显示全部楼层
回复 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)


相加或相减,自己处理吧.

评分

参与人数 1金钱 +10 贡献 +1 收起 理由
boyhong + 10 + 1 感谢您的热心,论坛因为有您更精彩~

查看全部评分

发表于 2012-5-30 21:25:11 | 显示全部楼层
本帖最后由 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)

评分

参与人数 3金钱 +60 贡献 +5 收起 理由
boyhong + 10 + 1 感谢A版一如既往的关照,论坛因为有您更精彩 ...
lixiaolong + 30 + 2 学习了!
user3000 + 20 + 2 为什么总这么深奥?!

查看全部评分

发表于 2012-5-30 21:27:38 | 显示全部楼层
回复 1# boyhong
楼主看来是没有接触过正则啊!正则对于文本的处理,那是杠杠的,当然要学好正则也不容易,但是简单的使用还是没有问题的,查找正则学习三十分钟的帖子,包你能够很好的解决你的问题,看到2楼的代码了吗?一句正则语句就帮你提取出来了,怎么样?赶紧去学习一下吧,真的很强大的正则。
发表于 2012-5-30 23:33:24 | 显示全部楼层
强大的正则哦
发表于 2012-5-31 01:35:47 | 显示全部楼层
好东西!!!!!!!学习了!谢谢
发表于 2012-5-31 06:37:30 | 显示全部楼层
本帖最后由 netegg 于 2012-5-31 15:38 编辑

不会正则
[au3]#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) <> '+' And  StringLeft($ret, 1) <>'+')
    ConsoleWrite(StringLeft($string, StringInStr($string, ',', 0, 3)) & Execute($ret) & @cr)
next
[/au3]
再给你一个,后面算和的

评分

参与人数 1金钱 +10 贡献 +1 收起 理由
boyhong + 10 + 1 嘿嘿,谢谢啦,其实我是有一个CSV的表格,最 ...

查看全部评分

发表于 2012-5-31 08:38:28 | 显示全部楼层
我的正则解决方法,昨登录不了,今补上吧。
$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[0] & @CRLF)
FileClose($jieguo)
MsgBox(0, "OK,完事了", $array[0])

评分

参与人数 1金钱 +10 贡献 +1 收起 理由
boyhong + 10 + 1 感谢您的热心,论坛因为有您更精彩~

查看全部评分

 楼主| 发表于 2012-5-31 15:20:46 | 显示全部楼层
感谢各位大牛,正则一段时间不拿,就陌生了。。。并且还带恐惧心理。。。
再次感谢,再去复习正则去了。。。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-19 01:42 , Processed in 0.080037 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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