heroxianf 发表于 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, "\h+", "")
                        $j = $j + 1
                        _Excel_RangeWrite($oWorkbook, Default, $bName, "A" & $j)
                                                _Excel_RangeWrite($oWorkbook, Default, $aTime, "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
我买了个飞机杯到现在都没到是什么原因呢.?

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

haijie1223 发表于 2016-3-22 10:34:43

我认为可以逐行获取,判断是不是含有用户名和时间,如果有,那过滤掉,那么剩下的就是聊天内容。

heroxianf 发表于 2016-3-22 10:46:28

我现在能想到的方法就是先去掉空行然后filereadtoarray到数组,然后再写入execl里面,速度有点慢的吓人!

heroxianf 发表于 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)

haijie1223 发表于 2016-3-22 11:30:43

回复 4# heroxianf


    你是不是只是想去掉空白行?

heroxianf 发表于 2016-3-22 12:43:47

回复 6# haijie1223

不是哈,我判断那里不知道如何写,因为时间也是有变化的!我用正则\d{}4-\d{2}-\d{2} 判断没有效果。如果从读出每行内容来判断就直接到EXCEL里就减少了一个环节,很好的。

heroxianf 发表于 2016-3-22 12:44:39

回复 5# 即即

我最终是要写入excel里面,我先试试你的代码。

haijie1223 发表于 2016-3-22 13:02:20

回复 8# heroxianf


    你想要获取哪一部分内容,能描述清楚吗?

heroxianf 发表于 2016-3-22 13:12:05

回复 9# haijie1223


按照你给的思路我可以完成所有做的事情,判断一句中有时间或用户名就记录到1.txt,如果没有时间或用户名就记录到b.txt

heroxianf 发表于 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 http://www.autoitx.com/images/common/back.gif

不知道楼主要的是什么。#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的数据")

heroxianf 发表于 2016-3-22 15:01:26

回复 12# 即即


谢谢,可以全部把内容抓取出来。我继续折腾一下。

haijie1223 发表于 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)

heroxianf 发表于 2016-3-23 10:33:35

回复 14# haijie1223

hai大你看看我折腾出来的,感觉获取用户名去掉空格那里还有点问题,请指点一下。{:face (239):}
页: [1] 2
查看完整版本: 正则获取对话内容[已解决]