Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 提取文本文件特定行的值和日期_Batch File - Fatal编程技术网

Batch file 提取文本文件特定行的值和日期

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

每周我都会收到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 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更改了输出日期模式

    :: 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!
    )
    
    模拟源文件USD*.txt的示例输出:

    您将获得正确对齐(和可排序)的输出:


    由于这是一项有趣的任务,我也不得不为此编写一个脚本(请参阅所有解释性的
    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