通过批处理文件(.BAT)从多行文本文件中提取特定字段

通过批处理文件(.BAT)从多行文本文件中提取特定字段

我是批处理程序的新手,我的妻子让我帮她加快加载速度。问题是,我将如何从此示例文本文件中提取业务日期、终端号(00099106)、交易金额和佣金?

[4w                                                    IST POS TERMINAL ACTIVITY REPORT
                                                  FOR CREDIT ACCOUNT NUMBER: 1120162163
Report No.: BDO030114                                                                                                              Page 1
Business Date: 03/02/2015                                                                                      Date Generated: 03/03/2015
=========================================================================================================================================
   TRANSACTION   |    TERMINAL    |      |        CARD        |      ACCOUNT       |   TRANSACTION   |RESULT|AUTH. |REV|MSG |  MERCHANT  
  DATE  |  TIME  |   NO.  |RECEIPT|BR NO.|       NUMBER       |        NO.         |CODE|   AMOUNT   | CODE |METHOD|IND|TYPE|   SHARE    
=========================================================================================================================================
03/01/15 23:54:30 00099106     203  00695 6018530000004863     ************          00      2,250.00   0      1        210               
               ===================================================================================================
                                   | CARD PRODUCT  | COUNT |       AMOUNT       |  COMMISSION  |
               ===================================================================================================
                                       00099106 SMARTELLER            1             2,250.00                
                                00099106 TOTAL:                       1             2,250.00                

                                       MERCHANT SMARTELLER            1             2,250.00          33.75 
                              MERCHANT   TOTAL:                       1             2,250.00          33.75 

                            TOTAL FOR PURCHASE:                       1             2,250.00          33.75 

                            TOTAL PER MERCHANT:                       1             2,250.00          33.75 

[4w

输出应该是这样的

03/02/2015;00099106;2,250.00;33.75

答案1

无论您使用什么编程语言或工具,您必须首先确定如何可靠地识别您需要提取的信息。

在我看来,您的日期跟在“营业日期:”后面,位于一行的开头。

终端号跟在行首的“nn/nn/nn nn:nn:nn ”(日期和时间)后面。

您不清楚您想要多少金额或佣金。我假设您想要的是“每个商家总计:”后面的值

使用纯批处理获取信息相当容易。

对于这个例子,我假设文本在名为 test.txt 的文件中。

FINDSTR 命令可以使用原始正则表达式查找包含数据的 3 行。该/R选项将搜索视为正则表达式。我使用单独的/C:"search string"选项来指定包含空格的每个搜索字符串。在查找以日期和时间开头的行时,我选择仅查找斜线和冒号,中间有适当数量的字符。

FOR /F 命令一次解析 FINDSTR 输出的三行。默认情况下,它将空格和制表符视为标记分隔符。连续空格的字符串被视为单个分隔符。因此,日期和终端号都是该行上的第 3 个标记。您的金额和佣金是该行上的第 5 个和第 6 个标记。

因此,我明确要求每行的第 3、第 5 和第 6 个标记,并指定%%A为第一个捕获的标记。这意味着第 3 个标记将在 中%%A,第 5 个标记在 中%%B,第 6 个标记在 中%%C

我明确清除了dtterm变量。这些行总是以相同的顺序出现,所以我只需检查是否dt已定义。如果没有,那么它一定是第一行,然后我设置日期值。否则我检查是否term已定义。如果没有,那么它一定是第二行,然后我设置终端值。否则它一定是第三行,然后我设置金额和佣金值。

@echo off
setlocal
set "dt="
set "term="
for /f "tokens=3,5,6" %%A in (
  'findstr /rc:"^Business Date:" /c:"^../../.. ..:..:.." /c:"TOTAL PER MERCHANT:" test.txt'
) do (
  if not defined dt (
    set "dt=%%A"
  ) else if not defined term (
    set "term=%%A"
  ) else (
    set "amt=%%B"
    set "comm=%%C"
  )
)
echo %dt%;%term%;%amt%;%comm%

使用纯批处理解决这个问题并不特别困难,但批处理通常不适合文本处理。它通常需要大量晦涩难懂的代码,并且/或者速度可能很慢。

我编写了 JREPL.BAT - 一个混合 JScript/批处理实用程序,可以非常高效地对文本执行复杂的正则表达式查找/替换操作。JREPL.BAT 是一个纯脚本,可​​以在 XP 及以上版本的任何 Windows 机器上本地运行。完整文档嵌入在实用程序中。可以通过发出 来访问它。如果您想一次查看一页帮助,jrepl /?可以使用。jrepl /?|more

假设您的 PATH 中的某个位置有 JREPL.BAT,则以下命令将提取信息:

@echo off
call jrepl "[\s\S]*\nBusiness Date: (.*?) (?:.*\n){5}.*? .*? (.*?) [\s\S]*?TOTAL PER MERCHANT: +.*? +(.*?) +([^ ]*)[\s\S]*" "$1;$2;$3;$4" /m /f test.txt
echo(

答案2

convert.cmd

powershell .\convert.ps1

电源外壳convert.ps1

$head=3
$f=gc data.txt
$f[$head..($f.count-1)]|%{
if($_.Contains("Business Date:"   )){$s=$_.split(': ')[3]};
if($_.Contains("MERCHANT   TOTAL:")){$MT=($_.trim()-replace'\s+',' ').split(' ');$s=$s+';'+$MT[-2]+';'+$MT[-1]};
if($_.Contains("SMARTELLER"       )){$SM=($_.trim()-replace'\s+',' ').split(' ');if($SM[0] -ne "MERCHANT"){$s=$s+';'+$SM[0]} };
} 
$s|ac short.txt

变量 2:

$f=gc data.txt
$s=$f[(3)].Substring(15,10)+';'+$f[(8)].Substring(18,8)+';'
$head=15
$f[$head..($f.count-1)]|%{if($_.Contains("MERCHANT   TOTAL:")){$MT=($_.trim()-replace'\s+',' ').split(' ');$s=$s+$MT[-2]+';'+$MT[-1]}} 
$s|ac short.txt

变量 3:

$f=gc data.txt
$s=$f[(3)].Substring(15,10)+';'+$f[(8)].Substring(18,8)+';'+($f[(16)].Substring(80,15)).Trim()+';'+$f[(16)].Substring(102,5)|ac short.txt

相关内容