找回密码
 加入
搜索
查看: 6099|回复: 21

[效率算法] 正则获取对话内容[已解决]

 火.. [复制链接]
发表于 2016-3-22 10:25:35 | 显示全部楼层 |阅读模式
本帖最后由 heroxianf 于 2016-3-23 10:28 编辑

感谢各位的帮助,问题解决了,把代码分享出来,希望对新朋友有帮助。附件中有范文!


Local $hFile, $text, $aStr, $sStr, $aTime, $cTime, $dTime, $aName, $bName
Local $oExcel, $oWorkbook, $i, $j
local $bTime = @YDAY & stringregexpreplace(_NowTime(), ":", "") &  _Timer_Init()

$hFile = FileOpen("test.txt")
$text = FileRead($hFile)
FileClose($hFile)
$oExcel = _Excel_Open(False)
$oWorkbook = _Excel_BookNew($oExcel)
$aStr = StringRegExp($text, "(?m)[\S].+", 3)
If IsArray($aStr) Then
        $j = 0
        For $i = 0 To UBound($aStr) - 1
                If StringRegExp($aStr[$i], "[\d{2,4}-]+\s[\d:]+") Then

                                        $aTime = stringRegExp($aStr[$i], "\d{2}:\d{2}:\d{2}", 1)
                                        $aName = stringRegExp($aStr[$i], ".+(?=\d{4}-\d{2}-\d{2})", 1)
                                        $bName = StringRegExpReplace($aName[0], "\h+", "")
                        $j = $j + 1
                        _Excel_RangeWrite($oWorkbook, Default, $bName, "A" & $j)
                                                _Excel_RangeWrite($oWorkbook, Default, $aTime[0], "B" & $j)
                Else
                        _Excel_RangeWrite($oWorkbook, Default, $aStr[$i], "C" & $j)
                EndIf
        Next
EndIf

_Excel_BookSaveAs($oWorkbook, @ScriptDir & "\" & $bTime & ".xlsx", Default, True)
_Excel_BookClose($oWorkbook)



tb-bj-shepei    2016-03-18 11:40:54
您好,请问有什么可以帮到您呢?#E-s07

向日葵1073    2016-03-18 11:40:56
在吗

tb-bj-shepei    2016-03-18 11:41:02
在的呢 您是遇到什么问题了呢?#E-s57#E-s57

向日葵1073    2016-03-18 11:42:34
我买了个飞机杯到现在都没到是什么原因呢.?


这是测试用例,我想获取对话内容请问正则该如何写呢?(内容可能是任何字符)
测试用例:

本帖子中包含更多资源

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

×
发表于 2016-3-22 10:34:43 | 显示全部楼层
我认为可以逐行获取,判断是不是含有用户名和时间,如果有,那过滤掉,那么剩下的就是聊天内容。
 楼主| 发表于 2016-3-22 10:46:28 | 显示全部楼层
我现在能想到的方法就是  先去掉空行然后filereadtoarray到数组,然后再写入execl里面,速度有点慢的吓人!
 楼主| 发表于 2016-3-22 10:48:10 | 显示全部楼层
本帖最后由 heroxianf 于 2016-3-22 10:50 编辑

回复 2# haijie1223
local $xArray = FileReadToArray(@scriptdir & '/test.txt')

For $i = 0 To ubound($xArray) - 1
;~         msgbox(0, '', $xArray[$i], 1)
        If $xArray[$i] = '' Then
                Sleep(100)
        Else
                FileWriteLine(@scriptdir & '/a.txt', $xArray[$i])
        EndIf

Next
ShellExecute(@scriptdir & '/a.txt')
hai大   用户名是变化的,有很多。
发表于 2016-3-22 11:15:14 | 显示全部楼层
本帖最后由 即即 于 2016-3-22 11:43 编辑

回复 1# heroxianf

初学正则,是否可以这样:Local $Replace = StringRegExpReplace($Value, '.+\d{4}-\d{2}-\d{2}.+|#E-.+', '', 0)

再把空行去掉:Local $Replace = StringRegExpReplace($Value, '.+\d{4}-\d{2}-\d{2}.+|#E-.+|\r\n\h*(?=\V|$)', '', 0)
发表于 2016-3-22 11:30:43 | 显示全部楼层
回复 4# heroxianf


    你是不是只是想去掉空白行?
 楼主| 发表于 2016-3-22 12:43:47 | 显示全部楼层
回复 6# haijie1223

不是哈,我判断那里不知道如何写,因为时间也是有变化的!我用正则  \d{}4-\d{2}-\d{2} 判断没有效果。如果从读出每行内容来判断就直接到EXCEL里  就减少了一个环节,很好的。
 楼主| 发表于 2016-3-22 12:44:39 | 显示全部楼层
回复 5# 即即

我最终是要写入excel里面,我先试试你的代码。
发表于 2016-3-22 13:02:20 | 显示全部楼层
回复 8# heroxianf


    你想要获取哪一部分内容,能描述清楚吗?
 楼主| 发表于 2016-3-22 13:12:05 | 显示全部楼层
回复 9# haijie1223


按照你给的思路我可以完成所有做的事情,  判断一句中有时间或用户名就记录到1.txt,如果没有时间或用户名就记录到b.txt
 楼主| 发表于 2016-3-22 14:33:43 | 显示全部楼层
回复 9# haijie1223
#include <excel.au3>

Local $oExcel = _Excel_Open(False)
Local $oWorkbook = _Excel_BookNew($oExcel)
Local $xArray = FileReadToArray(@ScriptDir & '/test.txt')

For $i = 0 To UBound($xArray) - 1
;~         msgbox(0, '', $xArray[$i], 1)
        If $xArray[$i] == '' Then
                Sleep(20)
        Else
                FileWriteLine(@ScriptDir & '/a.txt', $xArray[$i])
        EndIf

Next

Local $iArray = FileReadToArray(@ScriptDir & '/a.txt')

For $ii = 0 To UBound($iArray) - 1
;~     msgbox(0, "", $i, 1)
        If StringIsInt($ii / 2) = 0 Then
        _Excel_RangeWrite($oWorkbook, Default, $iArray[$ii], "B" & $ii)
        ElseIf StringIsInt($ii / 2) = 1 Then
        _Excel_RangeWrite($oWorkbook, Default, $iArray[$ii], "A" & $ii - 1 )
        EndIf
Next

_Excel_BookSaveAs($oWorkbook, @ScriptDir & "\_Excel.xlsx", Default, True)
_Excel_BookClose($oWorkbook)

ShellExecute(@ScriptDir & "\_Excel.xlsx")
我写成这样了,但是对于记录到excel里 还是有错行。请帮忙纠正一下!
发表于 2016-3-22 14:55:40 | 显示全部楼层
回复  即即

我最终是要写入excel里面,我先试试你的代码。
heroxianf 发表于 2016-3-22 12:44


不知道楼主要的是什么。
#include <Array.au3>
Local $ReadFile = FileRead(@scriptdir & '\test.txt')
Local $Replace = StringRegExpReplace($ReadFile, '.+\d{4}-\d{2}-\d{2}.+|#E-.+|\r\n\h*(?=\V|$)', '', 0)
Local $RegExp = StringRegExp($Replace, '.+', 3)
_ArrayDisplay($RegExp, "拟写入excel的数据")

评分

参与人数 1金钱 +20 收起 理由
heroxianf + 20 谢谢

查看全部评分

 楼主| 发表于 2016-3-22 15:01:26 | 显示全部楼层
回复 12# 即即


谢谢,可以全部把内容抓取出来。我继续折腾一下。
发表于 2016-3-22 15:58:40 | 显示全部楼层
回复 11# heroxianf


    是这样吗?
#include <excel.au3>
Local $hFile, $text, $aStr, $sStr
Local $oExcel, $oWorkbook, $i, $j
$hFile = FileOpen("test.txt")
$text = FileRead($hFile)
FileClose($hFile)
$oExcel = _Excel_Open(False)
$oWorkbook = _Excel_BookNew($oExcel)
$aStr = StringRegExp($text, "(?m)[\S].+", 3)
If IsArray($aStr) Then
        $j = 0
        For $i = 0 To UBound($aStr) - 1
                If StringRegExp($aStr[$i], "[\d{2,4}-]+\s[\d:]+") Then
                        $j = $j + 1
                        _Excel_RangeWrite($oWorkbook, Default, $aStr[$i], "A" & $j)
                Else
                        _Excel_RangeWrite($oWorkbook, Default, $aStr[$i], "B" & $j)
                EndIf
        Next
EndIf
_Excel_BookSaveAs($oWorkbook, @ScriptDir & "\_Excel.xlsx", Default, True)
_Excel_BookClose($oWorkbook)

评分

参与人数 1金钱 +20 收起 理由
heroxianf + 20 你钱够多了哈,谢谢了,解决问题。

查看全部评分

 楼主| 发表于 2016-3-23 10:33:35 | 显示全部楼层
回复 14# haijie1223

hai大  你看看我折腾出来的,感觉获取用户名去掉空格那里还有点问题,请指点一下。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-13 12:20 , Processed in 0.085071 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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