Extrai Campos Específicos de um Arquivo de Texto Multi-Lined via arquivo em lote (.BAT)

1

Eu sou novo no programa em lote e minha esposa me pediu para ajudá-la a acelerar sua carga. A pergunta é: como vou extrair a data do negócio, o terminal num (00099106), o valor da transação e a comissão deste arquivo de texto de amostra?

[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

A saída deve ser assim

03/02/2015;00099106;2,250.00;33.75
    
por Jhe 13.04.2015 / 13:05

2 respostas

0

Independentemente da linguagem de programação ou da ferramenta que você usa, você deve primeiro estabelecer como identificar de maneira confiável as informações que precisa extrair.

Parece-me que a sua data segue "Data da empresa:" no início de uma linha.

O número do terminal segue "nn / nn / nnnn: nn: nn" (data e hora) no início de uma linha.

Você não sabe ao certo qual quantidade ou comissão deseja. Suponho que você deseja os valores que seguem "TOTAL POR COMERCIANTE:"

É bastante fácil obter as informações usando o lote puro.

Para este exemplo, estou assumindo que o texto está em um arquivo chamado test.txt.

O comando FINDSTR pode procurar as 3 linhas que contêm seus dados usando expressões regulares primitivas. A opção /R trata as pesquisas como expressões regulares. Eu uso uma opção /C:"search string" separada para especificar cada seqüência de pesquisa que contém espaços. Ao procurar a linha que começa com uma data e hora, optei por simplesmente procurar as barras e dois-pontos com o número adequado de caracteres entre.

O comando FOR / F analisa as três linhas da saída FINDSTR, uma linha por vez. Por padrão, ele trata espaços e tabulações como delimitadores de token. Uma cadeia de espaços consecutivos é tratada como um único delimitador. Portanto, tanto a data quanto o número do terminal são o terceiro token na linha. Seu valor e comissão são o 5º e o 6º tokens na linha.

Por isso, solicito explicitamente os 3º, 5º e 6º tokens de cada linha, especificando %%A como o primeiro token capturado. Isso significa que o terceiro token estará em %%A , o quinto em %%B e o sexto em %%C .

Limpo explicitamente as variáveis dt e term . As linhas sempre aparecem na mesma ordem, então eu simplesmente verifico se dt está definido. Se não, então deve ser a primeira linha e eu defino o valor da data. Caso contrário, eu verifico se term está definido. Se não, então deve ser a segunda linha e eu definir o valor do terminal. Caso contrário, deve ser a terceira linha e eu defino os valores de quantidade e comissão.

@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%

Este problema não foi particularmente difícil de resolver usando o lote puro, mas muitas vezes o lote não é adequado para o processamento de texto. Muitas vezes requer muito código arcano e / ou pode ser lento.

Escrevi o JREPL.BAT - um utilitário híbrido JScript / batch que pode executar operações de localização / substituição de expressões regulares sofisticadas de maneira muito eficiente no texto. O JREPL.BAT é um script puro que é executado nativamente em qualquer máquina Windows do XP em diante. A documentação completa está incorporada no utilitário. Pode ser acessado emitindo jrepl /? . Você pode usar jrepl /?|more se quiser ver a ajuda uma página por vez.

Supondo que você tenha o JREPL.BAT em algum lugar dentro de seu PATH, o seguinte extrairá as informações:

@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(
    
por 13.04.2015 / 15:49
0

convert.cmd :

powershell .\convert.ps1

powershell 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

Var 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

Var 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
    
por 13.04.2015 / 16:35