找回密码
 加入
搜索
查看: 2042|回复: 7

[AU3基础] 请教一下读取txt指定最近三个月日期的行出来?

[复制链接]
发表于 2020-9-17 14:42:23 | 显示全部楼层 |阅读模式
通过参数输出电脑已安装补丁到C盘bd.txt文件,因为时间不是按顺序的很麻烦,如何读取并提取最近三个月的那些行并copy出来呢???请教一下大师们



举个例子,下面是bd.txt文件内容,然后提取最近三个月的,红色那个就是最近三个月要提取出来的行。
CSName           HotFixID   InstalledOn  
COMPUTER01  KB4346084  9/12/2020   
COMPUTER01  KB4456655  11/16/2019   
COMPUTER01  KB4512576  7/16/2020   
COMPUTER01  KB4516058  11/18/2019   


发表于 2020-9-17 14:58:33 | 显示全部楼层
本帖最后由 afan 于 2020-9-17 15:00 编辑
#include <Date.au3>
Local $sSource = _
                'CSName           HotFixID   InstalledOn  ' & @CRLF & _
                'COMPUTER01  KB4346084  9/12/2020   ' & @CRLF & _
                'COMPUTER01  KB4456655  11/16/2019   ' & @CRLF & _
                'COMPUTER01  KB4512576  7/16/2020   ' & @CRLF & _
                'COMPUTER01  KB4516058  11/18/2019   '
;~ MsgBox(0, '源字符串', $sSource)
Local $aSRE = StringRegExp($sSource, "(?m)^(.+\h+(\d+)/(\d+)/(\d+))\h*$", 3)
If @Error Then Exit MsgBox(48, '', '数据不符')
Local $sOut = '', $vtmp
For $ii = 0 To UBound($aSRE) - 1 Step 4
        $vtmp = StringFormat('%04d/%02d/%02d', $aSRE[$ii + 3], $aSRE[$ii + 1], $aSRE[$ii + 2])
        If _DateDiff('M', $vtmp, _NowCalc()) <= 3 Then
                $sOut &= $aSRE[$ii] & @CRLF
        EndIf
Next
MsgBox(0, '', $sOut)
 楼主| 发表于 2020-9-17 15:58:49 | 显示全部楼层

谢谢afan版主帮忙 现在在火车上没有电脑 如果源文件是c:\buding.txt 第二到八行怎么改一下呢 在车上没有电脑 麻烦有空帮忙修正一下
发表于 2020-9-17 16:03:10 | 显示全部楼层
229989799 发表于 2020-9-17 15:58
谢谢afan版主帮忙 现在在火车上没有电脑 如果源文件是c:\buding.txt 第二到八行怎么改一下呢 在车上没有 ...

晕死。
Local $sSource = FileRead('c:\buding.txt')
 楼主| 发表于 2020-9-17 16:39:43 | 显示全部楼层


提问一下版主,,13行14行正则那一段是以当天日期算起近三个月,还是只是今天算起近三个月的呢?因为经常使用,
发表于 2020-9-17 18:50:38 | 显示全部楼层
229989799 发表于 2020-9-17 16:39
提问一下版主,,13行14行正则那一段是以当天日期算起近三个月,还是只是今天算起近三个月 ...

“当天日期算起近三个月” 这个当天日期是指哪天?
发表于 2020-9-18 00:58:22 | 显示全部楼层
本帖最后由 yohoboy 于 2020-9-18 01:10 编辑

重新改寫a大的方式,執行後就知道怎麼修改符合您的需求。謝謝a大提供代碼,簡潔有力。
#include <Date.au3>
#include <Array.au3>
Local $sSource = 'CSName                HotFixID                InstalledOn  ' & @CRLF & _
                                'COMPUTER01        KB4346084        9/12/2020   ' & @CRLF & _
                                'COMPUTER01        KB4456655        11/16/2019  ' & @CRLF & _
                                'COMPUTER01        KB4512576        7/16/2020   ' & @CRLF & _
                                'COMPUTER01        KB4516058        11/18/2019  '
;Local $sSource = FileRead('c:\buding.txt') ;可指定要讀取的檔案路徑
MsgBox(0, '源字符串', $sSource); 顯示已讀取的檔案內容
Local $aSRE = StringRegExp($sSource,"(?m)^(.+\h+(\d+)/(\d+)/(\d+))\h*$", 3) ;正則提取該行有日期文字之內容
If @Error Then
        Exit MsgBox(48, '資料錯誤', '数据不符')
Else
        _ArrayDisplay($aSRE) ;寫這行可以知道正則後組數之內容
        Local $sOut = '', $vtmp ;設定變數
        For $i = 0 To UBound ($aSRE) - 1 Step 4 ;由第一個組數讀取到最後一個組數,並以隔4累加
                $vtmp = StringFormat('%04d/%02d/%02d', $aSRE[$i + 3], $aSRE[$i + 1], $aSRE[$i + 2]) ;將該組數讀取並轉為日期格式
                If _DateDiff('M', $vtmp, _NowCalc()) <= 3 Then ;以月為單位,只要3個月內文字則讀取下來
                        $sOut &= $aSRE[$i] & @CRLF
                EndIf
        Next
        MsgBox(0, '3個月內','CSName                HotFixID                InstalledOn  ' & @CRLF & $sOut) ;整理過後的3個月內文字
EndIf
发表于 2020-9-21 11:05:43 | 显示全部楼层
这货是偶尔上来打一卦
或者仍然在车上
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-4-24 19:46 , Processed in 0.078386 second(s), 19 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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