Batch file 提取文本文件特定行的值和日期
每周我都会收到6或7个Batch file 提取文本文件特定行的值和日期,batch-file,Batch File,每周我都会收到6或7个.txt文件,如下所示: 20/06/18 08:18 1 14 (Sucess, no confirmation needed) 00 0 TEST2 ANOTHERS/ADM 2 0 0 1 164 000000 complete operation 44376390 0 1 CLIENT
.txt
文件,如下所示:
20/06/18 08:18 1 14 (Sucess, no confirmation needed) 00 0 TEST2 ANOTHERS/ADM 2 0 0 1 164 000000 complete operation 44376390 0 1 CLIENT Windows 48
20/06/18 08:19 1 1 (ok) 00 1 TEST ANOTHERS/ADM 2 0 0 4 167 000000 TRANSACAO APROVED 44376393 0 1 CLIENT Windows 48
20/06/18 08:21 1 2 (ok) 01 0 TEST2 ANOTHERS/ADM 2 0 0 4 000000 complete operation 0 0 48
20/06/18 08:25 1 14 (Sucess, no confirmation needed) 00 0 TEST2 ANOTHERS/ADM 2 0 0 986 5 168 000000 41031930 BEGIN OK 44376394 0 1 CLIENT Windows 48
20/06/18 08:31 1 14 (Sucess, no confirmation needed) 01 0 TEST2 ANOTHERS/ADM 2 0 0 986 6 129 000000 41031931 BEGIN OK 51321421 0 1 CLIENT Windows 48
20/06/18 08:32 1 14 (Sucess, no confirmation needed) 00 0 TEST2 ANOTHERS/ADM 2 0 0 6 169 000000 41031930 BAIXA OK 44376395 0 1 CLIENT Windows 48
20/06/18 08:32 1 14 (Sucess, no confirmation needed) 00 0 TEST2 ANOTHERS/ADM 2 0 0 7 170 000000 41031930 TEST OK 44376396 0 1 CLIENT Windows 48
20/06/18 08:33 1 14 (Sucess, no confirmation needed) 01 0 TEST2 ANOTHERS/ADM 2 0 0 7 130 000000 41031931 BAIXA OK 51321422 0 1 CLIENT Windows 48
20/06/18 08:33 1 14 (Sucess, no confirmation needed) 01 0 TEST2 ANOTHERS/ADM 2 0 0 8 131 000000 41031931 TEST OK 51321423 0 1 CLIENT Windows 48
20/06/18 08:38 1 2 (ok) 00 4 TEST3 ANOTHERS/ADM 2 0 0 11 585945 complete operation 0 0 48
20/06/18 08:38 1 2 (ok) 00 4 TEST3 ANOTHERS/ADM 2 0 0 12 585946 00000001 000000000001064 SITUACAO DA TEST OK 0 0 48
20/06/18 08:39 1 2 (ok) 01 4 TEST3 ANOTHERS/ADM 2 0 0 10 585946 complete operation 0 0 48
20/06/18 08:39 1 2 (ok) 01 4 TEST3 ANOTHERS/ADM 2 0 0 11 585947 00000002 000000000001064 SITUACAO DA TEST OK 0 0 48
20/06/18 09:28 1 1 (ok) 01 0 TEST2 VD DEB 1 2 1 1 FOUND DEBITO 986 11,61 13 134 586242 586242 229873 41031931 0010505962400001 APROVED 229873 12 0 1 CLIENT Windows 48
20/06/18 09:40 1 1 (ok) 01 1 TEST ANOTHERS/ADM 0 0 0 14 135 000000 0 1 CLIENT Windows 48
20/06/18 10:40 1 1 (ok) 01 0 TEST2 VD CRED 3P LOJ 1 1 3 3 FOUND CREDITO 986 154,30 15 136 586244 586244 600109 41031931 0010505962400001 APROVED 600109 19 0 1 CLIENT Windows 48
20/06/18 11:32 1 1 (ok) 01 4 TEST3 VD CRED 6P LOJ 1 1 3 6 FOUND 986 369,80 17 138 585948 00184281 009989 00000002 000000000001064 AUTORIZED 21 0 1 CLIENT Windows 48
20/06/18 11:56 1 1 (ok) 01 1 TEST VD CRED 6P LOJ 1 1 3 6 FOUND 986 103,80 18 139 000761 248937832 071579 DK059325 000000046782664 TRANSACAO APROVED 24 0 1 CLIENT Windows 48
20/06/18 12:24 1 1 (ok) 01 0 TEST2 VD DEB 1 2 1 1 FOUND DEBITO 986 9,90 19 140 586246 586246 295898 41031931 0010505962400001 APROVED 295898 26 0 1 CLIENT Windows 48
20/06/18 13:48 1 1 (ok) 01 4 TEST3 VD CRED 3P LOJ 1 1 3 3 TEST3 986 174,85 23 146 585950 00354147 244207 00000002 000000000001064 AUTORIZED 36 0 1 CLIENT Windows 48
20/06/18 13:50 1 1 (ok) 01 4 TEST3 VD DEB 3P LOJ 1 2 3 3 FOUND 986 90,79 24 147 585951 00356608 356608 00000002 000000000001064 AUTORIZED 37 0 1 CLIENT Windows 48
20/06/18 14:44 1 1 (ok) 01 4 TEST3 VD CRED 2P LOJ 1 1 3 2 FOUND 986 73,70 26 150 585952 00417993 OCP3EF 00000002 000000000001064 AUTORIZED 42 0 1 CLIENT Windows 48
20/06/18 14:55 1 1 (ok) 01 4 TEST3 VD DEB 1 2 1 FOUND 986 30,80 27 151 585953 00432024 432024 00000002 000000000001064 AUTORIZED 44 0 1 CLIENT Windows 48
20/06/18 15:11 1 1 (ok) 01 4 TEST3 VD DEB 1 2 1 FOUND 986 56,80 28 152 585954 00451469 451469 00000002 000000000001064 AUTORIZED 48 0 1 CLIENT Windows 48
20/06/18 15:16 1 1 (ok) 01 4 TEST3 VD CRED 3P LOJ 1 1 3 3 FOUND 986 473,40 29 153 585955 00458420 051473 00000002 000000000001064 AUTORIZED 49 0 1 CLIENT Windows 48
20/06/18 15:21 1 1 (ok) 01 4 TEST3 VD CRED 5P LOJ 1 1 3 5 FOUND 986 89,90 30 154 585956 00464225 210069 00000002 000000000001064 AUTORIZED 52 0 1 CLIENT Windows 48
20/06/18 15:22 1 1 (ok) 01 4 TEST3 VD DEB 2P LOJ 1 2 3 2 FOUND 986 74,79 31 155 585957 00466243 466243 00000002 000000000001064 AUTORIZED 53 0 1 CLIENT Windows 48
20/06/18 15:25 1 1 (ok) 01 4 TEST3 VD CRED 3P LOJ 1 1 3 3 FOUND 986 51,80 32 156 585958 00469765 R62243 00000002 000000000001064 AUTORIZED 54 0 1 CLIENT Windows 48
20/06/18 15:28 1 1 (ok) 01 4 TEST3 VD CRED 2P LOJ 1 1 3 2 FOUND 986 66,80 33 157 585959 00474327 068082 00000002 000000000001064 AUTORIZED 56 0 1 CLIENT Windows 48
20/06/18 16:04 1 1 (ok) 01 4 TEST3 VD CRED 1 1 1 FOUND 986 42,60 34 158 585960 00522515 132114 00000002 000000000001064 AUTORIZED 63 0 1 CLIENT Windows 48
20/06/18 16:19 1 1 (ok) 01 4 TEST3 VD DEB 2P LOJ 1 2 3 2 FOUND 986 54,50 35 159 585961 00543569 543569 00000002 000000000001064 AUTORIZED 64 0 1 CLIENT Windows 48
20/06/18 16:28 1 1 (ok) 01 4 TEST3 VD CRED 1 1 1 FOUND 986 53,60 36 160 585962 00555871 096895 00000002 000000000001064 AUTORIZED 65 0 1 CLIENT Windows 48
20/06/18 16:36 1 1 (ok) 01 4 TEST3 VD CRED 2P LOJ 1 1 3 2 TEST3 986 135,40 37 161 585963 00567178 645238 00000002 000000000001064 AUTORIZED 67 0 1 CLIENT Windows 48
20/06/18 17:09 1 3 (manually confirmed) 01 4 TEST3 VD CRED 2P LOJ 1 1 3 2 TEST3 986 43,69 41 165 585964 00615982 043774 00000002 000000000001064 AUTORIZED 69 0 1 CLIENT Windows 48
20/06/18 17:11 1 1 (ok) 01 4 TEST3 ANOTHERS/ADM 0 0 0 42 166 000000 complete operation 0 1 CLIENT Windows 48
20/06/18 17:47 1 1 (ok) 01 4 TEST3 VD DEB 1 2 0 TEST3 986 48,80 43 167 585965 00682484 164024 00000002 000000000001064 AUTORIZED 73 0 1 CLIENT Windows 48
36 AA295617939D4C16073C5AD86919821D101770A4 221163 0
它们的行数不同,日期不同,值也不同
但我需要的很简单,我只需要在.bat
中找到.txt
文件的最后一行(36 AA295617939D4C16073C5AD86919821D101770A4 221163 0
)的脚本,然后取第三列221163
的值,然后将其转换为USD:USD 2.211,63
。然后取上一行20/06/18
中第一列的日期,并将其与值连接起来。
它必须是这样的:20/06/18美元2.211,63
好的,现在它将像一样保存所有的_files.txt
。
它必须处理文件夹中的所有.txt
文件,并保存在同一输出文件中。结果将与此类似,例如:
20/06/18 USD 2.211,63
24/06/18 USD 8.289,45
29/06/18 USD 9.211,99
07/07/18 USD 24.653,76
09/07/18 USD 99.701,32
15/08/18 USD 3.291,19
我用这种方式做了一些尝试:
@echo off
setlocal enabledelayedexpansion
for /f "tokens=3" %%i in ('findstr /i %1 c:\test\*.txt ^| findstr /i %2') do (
set last_value=%%i
)
set=!last_value!
for /f %%x in (%date%) do for /f "delims=.txt, tokens=1" %%i in (%%x.txt) do echo %%x, %%i >> all_files.txt
但事情并不像我预期的那样发展。我怎样才能使它发挥作用
现在就尝试:
SET SearchFile=test.txt
SET TmpSearchFile=output.txt
SET String=%date%
SET LineNum=3
FINDSTR /B /N "%String%" "%SearchFile%" > "%TmpSearchFile%"
FOR /F "USEBACKQ TOKENS=2 DELIMS=: " %A IN (`"FINDSTR /B "%LineNum%:%String%" "%TmpSearchFile%""`) DO ECHO %~A %~A`
我会一步一步走,但问题是脚本无法识别%date%
,我如何才能在那行instaed%date%
中使用当前单词
刚刚尝试按日期对输出文件进行排序
REM get first line:
<all_files.txt set /p first=
REM write it to a new file:
>"test.txt" echo %first%
REM sort the rest and append to the new file:
<all_files.txt more +1|sort >>"test.txt"
del /f /s /q all_files.txt >nul 2>nul
@Lotpings只是稍微更改了您上一个脚本,但仍然没有按日期排序
@echo off & setlocal enabledelayedexpansion
mode 34,12
Set "OutFile=all_files.txt"
For %%A in (*.txt) do (
for /f "tokens=1,3" %%T in ('findstr "^" "%%~fA"') do (
set "USD= %%U"
set "LastDate=!ThisDate!"
set "ThisDate=%%T"
)
set "Out=!USD:~0,-5!.!USD:~-5,3!,!USD:~-2,2!"
set "Out=!Out: .=!"
>>"%OutFile%" Echo=!LastDate:~0,2!-!LastDate:~3,2!-20!LastDate:~6,2! USD !OUT:~-10!
)
查看输出文件:
20/06/18 R$ 2.211,63
22/06/18 R$ 1.761,63
03/07/18 R$ 3.042,21
25/06/18 R$ 1.311,57
21/06/18 R$ 22.842,88
20-06-2018 USD 2.211,63
22-06-2018 USD 1.761,63
03-07-2018 USD 3.042,21
25-06-2018 USD 1.311,57
21-06-2018 USD 22.842,88
就像你给我看的一样,但对我来说没有分类
@SETLOCAL ENABLEDELAYEDEXPANSION
@ECHO OFF
FOR %%f in (*.txt) DO (
SET PREV_DATE_STAMP=
SET DATE_STAMP=
SET AMOUNT=
FOR /F "tokens=1,3" %%a IN (%%f) DO (
REM Keep the two most recent stamps.
SET "PREV_DATE_STAMP=!DATE_STAMP!"
SET "DATE_STAMP=%%~a"
REM Keep the last amount datum.
SET "AMOUNT=%%~b"
)
REM Format the amount. This is tricky to do intelligently with CMD.
SET /A "NUM_AMOUNT=!AMOUNT!"
REM -> #########,##
SET FMT_AMOUNT=!AMOUNT:~0,-2!,!AMOUNT:~-2!
REM Add the digit grouping for thousands
IF !NUM_AMOUNT! GEQ 10000 SET "FMT_AMOUNT=!FMT_AMOUNT:~0,-6!.!FMT_AMOUNT:~-6!"
REM Add the digit grouping for millions
IF !NUM_AMOUNT! GEQ 10000000 SET "FMT_AMOUNT=!FMT_AMOUNT:~0,-10!.!FMT_AMOUNT:~-10!"
REM CMD only uses 32-bit integers, so you millions are the largest value you'll ever get (last 2 digits are hundredths)
SET "FMT_AMOUNT= !FMT_AMOUNT!"
@ECHO !PREV_DATE_STAMP! USD !FMT_AMOUNT:~-12!
)
这个脚本完成了您描述的工作。对于你所需要的,CMD在
- 格式化数字
- 处理小数
- 处理不同的行格式
- 效率
- 日期和下一列之间的空格分隔符
- 最后一条记录前四列之间的空格分隔符
- 金额不太大(编辑更改为从最后一行的第二行获取日期
EDIT2更改了输出日期模式
模拟源文件USD*.txt的示例输出: 您将获得正确对齐(和可排序)的输出::: Q:\Test\2018\06\27\SO_51064650.cmd @echo off & setlocal enabledelayedexpansion Set "OutFile=all_files.txt" For %%A in (*.txt) do ( for /f "tokens=1,3" %%T in ('findstr "^" "%%~fA"') do ( set "USD= %%U" set "LastDate=!ThisDate!" set "ThisDate=%%T" ) set "Out=!USD:~0,-5!.!USD:~-5,3!,!USD:~-2,2!" set "Out=!Out: .=!" >>"%OutFile%" Echo=20!LastDate:~6,2!-!LastDate:~3,2!-!LastDate:~0,2! USD !OUT:~-10! )
由于这是一项有趣的任务,我也不得不为此编写一个脚本(请参阅所有解释性的
备注):rem
@echo关闭 setlocal EnableExtensions DisableDelayedExpansion rem//在此处定义常量: 设置“_ROOT=%~dp0.”&rem//(包含要处理的文本文件的目录) 设置“_MASK=*.txt”&rem//(要处理的文本文件的文件名模式) 设置“_LIST=all_files.txt”&rem/(结果文本文件的名称或路径) 设置“\u TEMP=%TEMP%\%~n0\u%RANDOM%.tmp”&rem/(临时文件的名称或路径) 设置“_CURR=USD”&rem/(返回货币符号或缩写) 设置/A“\u LPAD=0”&rem//(返回金额的最小字符宽度) rem//应用默认值(如果适用): 如果未定义_listset“_LIST=con” 如果定义了_currset“_CURR=%\u CURR%” rem//临时更改为包含文本文件的目录: pushd“%\u根%”和( rem//将输出写入临时文本文件: >“%\u温度%”( rem//解析结果文本文件的路径: 对于%%E in(“%\u LIST%”)执行以下操作( rem//循环浏览按年龄排序的所有文本文件: 对于/F“delims=eol=|”%%F in('dir/B/A:-D/O:D“%\u MASK%”)do( rem//如果结果文本文件位于同一位置,则排除它: 如果/I不是“%%~fF”==“%%~fE”( rem//初始化日期和金额的变量: set“DAT=“&set”VAL=“&set”PRE=“&set”KEY=” rem//遍历当前文本文件的行: 对于/F“usebackq令牌=1,3”%%G in(“%%~F”)do( rem//存储某些令牌(最后一行的金额): 设置“VAL=%%H” rem//延迟另一个令牌的存储(日期): setlocal EnableDelayedExpansion ( 对于(“!DAT!”)中的/F“tokens=1-3 delims=/”%%J,请执行以下操作( 端部 设置“PRE=%%J/%%K/%%L” rem//生成可排序日期格式(排序键): 如果%%L lss 70( 设置“键=20%%L/%%K/%%J” )否则( 设置“键=19%%L/%%K/%%J” ) ) )| | endlocal 设置“DAT=%%G” ) rem//检查是否找到日期和金额标记: 如果定义了预定义的如果定义了VAL( setlocal EnableDelayedExpansion rem/*使用数字分组将金额转换为十进制数 在一个单独的子程序中,rem为数千:*/ 呼叫:CONV STR“!VAL!”\u LPAD! rem//返回结果字符串: 回声(!键!!前!!\u当前!!STR! 端部 ) ) ) ) ) rem//将输出写入结果文本文件: >“%\u列表%”( rem//读取已排序的临时文本文件并分离排序键: 对于/F“tokens=1*”%%K in('sort“%\u TEMP%”)do( rem//返回剩余字符串: 回声(%%L ) ) rem//清理临时文件: 删除“%\u温度%” 邻苯二胺 ) 端部 退出/B :CONV ::将纯自然整数转换为小数的子程序 ::带两位小数,数字分组为千位。如果输入 ::值包含十进制数字以外的字符,按原样返回。 ::参数: ::要接收结果输出字符串的变量的名称
> sort all_files.txt 2018-06-20 USD 2.211,63 2018-06-24 USD 8.289,45 2018-06-29 USD 9.211,99 2018-07-07 USD 24.653,76 2018-07-09 USD 99.701,32 2018-08-15 USD 291,19 2018-08-15 USD 291,19 2018-08-15 USD 3.291,19
## Q:\Test\2018\06\27\SO_51064650.ps1 $InFile = ".\*.txt" $OutFile = "all_files.txt" $DateUSD = ForEach ($File in (Get-ChildItem $InFile -File -Exclude $OutFile)){ $Text = (Get-Content $File | Select-Object -Last 2) $USD = [Decimal](($Text[1] -split ' +')[2]/100) [PSCustomObject]@{ Date = ($Text[0] -split ' +')[0] USD1 = $USD USD2 = "{0,11:C}" -f $USD USD3 = "{0,9:N}" -f $USD USD4 = "USD {0,9:N}" -f $USD } } $DateUSD | Sort-Object {[DateTime]::ParseExact($_.Date,'dd/MM/yy',$Null)} | ft -auto | Out-String | Set-Content $OutFile
> Get-Content .\all_files.txt Date USD1 USD2 USD3 USD4 ---- ---- ---- ---- ---- 20/06/18 2211,63 2.211,63 € 2.211,63 USD 2.211,63 24/06/18 8289,45 8.289,45 € 8.289,45 USD 8.289,45 29/06/18 9211,99 9.211,99 € 9.211,99 USD 9.211,99 07/07/18 24653,76 24.653,76 € 24.653,76 USD 24.653,76 09/07/18 99701,32 99.701,32 € 99.701,32 USD 99.701,32 15/08/18 291,19 291,19 € 291,19 USD 291,19 15/08/18 3291,19 3.291,19 € 3.291,19 USD 3.291,19 15/08/18 291,19 291,19 € 291,19 USD 291,19