229989799 发表于 2020-9-17 14:42:23

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

通过参数输出电脑已安装补丁到C盘bd.txt文件,因为时间不是按顺序的很麻烦,如何读取并提取最近三个月的那些行并copy出来呢???请教一下大师们



举个例子,下面是bd.txt文件内容,然后提取最近三个月的,红色那个就是最近三个月要提取出来的行。
CSName         HotFixID   InstalledOn
COMPUTER01KB43460849/12/2020   
COMPUTER01KB445665511/16/2019   
COMPUTER01KB45125767/16/2020
COMPUTER01KB451605811/18/2019   


afan 发表于 2020-9-17 14:58:33

本帖最后由 afan 于 2020-9-17 15:00 编辑

#include <Date.au3>
Local $sSource = _
                'CSName         HotFixID   InstalledOn' & @CRLF & _
                'COMPUTER01KB43460849/12/2020   ' & @CRLF & _
                'COMPUTER01KB445665511/16/2019   ' & @CRLF & _
                'COMPUTER01KB45125767/16/2020   ' & @CRLF & _
                'COMPUTER01KB451605811/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)

229989799 发表于 2020-9-17 15:58:49

afan 发表于 2020-9-17 14:58


谢谢afan版主帮忙 现在在火车上没有电脑 如果源文件是c:\buding.txt 第二到八行怎么改一下呢 在车上没有电脑 麻烦有空帮忙修正一下

afan 发表于 2020-9-17 16:03:10

229989799 发表于 2020-9-17 15:58
谢谢afan版主帮忙 现在在火车上没有电脑 如果源文件是c:\buding.txt 第二到八行怎么改一下呢 在车上没有 ...

晕死。
Local $sSource = FileRead('c:\buding.txt')

229989799 发表于 2020-9-17 16:39:43

afan 发表于 2020-9-17 16:03
晕死。

:face (25):
提问一下版主,,13行14行正则那一段是以当天日期算起近三个月,还是只是今天算起近三个月的呢?因为经常使用,

afan 发表于 2020-9-17 18:50:38

229989799 发表于 2020-9-17 16:39
提问一下版主,,13行14行正则那一段是以当天日期算起近三个月,还是只是今天算起近三个月 ...

“当天日期算起近三个月” 这个当天日期是指哪天?

yohoboy 发表于 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

afan 发表于 2020-9-21 11:05:43

这货是偶尔上来打一卦
或者仍然在车上
页: [1]
查看完整版本: 请教一下读取txt指定最近三个月日期的行出来?