1

Я новичок в пакетной программе, и моя жена попросила меня помочь ей ускорить загрузку. Вопрос в том, как мне извлечь из этого образца текстового файла рабочую дату, номер терминала (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

2 ответа2

0

Независимо от того, какой язык программирования или инструмент вы используете, вы должны сначала определить, как вы будете надежно идентифицировать информацию, которую вам нужно извлечь.

Мне кажется, что вы следите за датой "Business Date:" в начале строки.

Номер терминала следует за «nn /nn /nn nn:nn:nn» (дата и время) в начале строки.

Вам не ясно, какую сумму или комиссию вы хотите. Я предполагаю, что вы хотите значения, следующие за "ВСЕГО НА ТОРГОВУЮ:"

Достаточно легко получить информацию, используя чистую партию.

Для этого примера я предполагаю, что текст находится в файле с именем test.txt.

Команда FINDSTR может искать 3 строки, содержащие ваши данные, используя примитивные регулярные выражения. Параметр /R обрабатывает поиск как регулярные выражения. Я использую отдельный параметр /C:"search string" чтобы указать каждую строку поиска, которая содержит пробелы. При поиске строки, начинающейся с даты и времени, я решил просто искать косую черту и двоеточие с надлежащим количеством символов между ними.

Команда FOR /F анализирует три строки вывода FINDSTR, по одной строке за раз. По умолчанию он обрабатывает пробелы и символы табуляции как разделители токенов. Строка последовательных пробелов рассматривается как один разделитель. Таким образом, и дата, и номер терминала являются третьим токеном на линии. Ваша сумма и комиссия - это 5-й и 6-й токены на линии.

Поэтому я явно запрашиваю 3-й, 5-й и 6-й токены в каждой строке, указав %%A в качестве первого захваченного токена. Это означает, что третий токен будет в %%A , 5-й в %%B и 6-й в %%C

Я явно очищаю переменные dt и term . Строки всегда отображаются в одном и том же порядке, поэтому я просто проверяю, определен ли dt . Если нет, то это должна быть первая строка, и я установил значение даты. В противном случае я проверяю, определен ли term . Если нет, то это должна быть вторая строка и я устанавливаю значение терминала. В противном случае это должна быть 3-я строка, и я устанавливаю сумму и комиссионные значения.

@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/batch, которая может очень эффективно выполнять сложные операции поиска / замены регулярных выражений над текстом. JREPL.BAT - это чистый скрипт, который запускается на любом компьютере с Windows начиная с XP. Полная документация встроена в утилиту. Доступ к нему можно получить, jrepl /? , Вы можете использовать jrepl /?|more если вы хотите видеть справку по одной странице за раз.

Предполагая, что у вас есть JREPL.BAT где-то в вашем PATH, следующее извлечет информацию:

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

Вар 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .