我是批处理程序的新手,我的妻子让我帮她加快加载速度。问题是,我将如何从此示例文本文件中提取业务日期、终端号(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
。
我明确清除了dt
和term
变量。这些行总是以相同的顺序出现,所以我只需检查是否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