2017-01-11 4 views
0

Я следующий текст генерируется из пакетного файла:Извлечение текстовых значений из строки в пакетном

FILE:71.jpg 88557: (0, 0, 0) #000000 black 535: (0, 0,255) #0000FF blue 3617: (0,255, 0) #00FF00 lime 315: (0,255,255) #00FFFF cyan 9674: (255, 0, 0) #FF0000 red 214: (255, 0,255) #FF00FF magenta 5552: (255,255, 0) #FFFF00 yellow 11536: (255,255,255) #FFFFFF white 

, и я хочу, чтобы извлечь значения следующим образом:

8857: black 
535: blue 
3617: lime 
etc.. 

Есть ли способ, что это можно сделать, пожалуйста? Извините, но я не испытываю партию.

+2

Это все на одной линии? Откуда вы знаете, когда выполняется цветовая секция? – SomethingDark

+0

Обратите внимание, что StackOverflow не является бесплатной службой записи кода!Поделитесь своими усилиями и четко опишите, с чем вы столкнулись! Пожалуйста, прочитайте [тур] и узнайте, как использовать этот сайт! – aschipfl

ответ

1

Pressuming, что одна строка строка является единственным в файле File.txt:

@Echo off 
Set /P String=<File.txt 
Set String=%String:(="% 
Call :Sub %String:)="% 
Goto :Eof 
:Sub 
shift 
If "%~1"=="" Goto :Eof 
Echo %1 | findstr "# ," >Nul 2>&1 && goto :sub 
Set var=%1 
If "%var:~-1%" equ ":" (set /p =%var% <Nul) Else Echo:%1 
goto :Sub 

Выход

88557: black 
535: blue 
3617: lime 
315: cyan 
9674: red 
214: magenta 
5552: yellow 
11536: white 

Set /p читает одну строку из file.txt через перенаправление ввода.
%String:(="% обменивает круглые скобки двойной косой, чтобы упростить синтаксический анализ.
Команда shift пропускает первый аргумент, а затем переходит к следующему аргументу. Findstr в субэлементах ненужных элементов.
В случае если текущий аргумент имеет завершающий двоеточие, если да, то выдается через set/p без crlf, если не просто echo current arg.

1

Ниже приведен довольно надежный сценарий, который извлекает информацию о цвете из текстового файла, который предоставляется в качестве аргумента командной строки. Текстовый файл может содержать даже несколько строк. Скрипт обрабатывает только строки, которые начинаются с литеральной строки FILE:, а затем строка, которая не содержит :, \, ПРОСТРАНСТВО (например, 71.jpg в вашем примере). Так вот код, в том числе некоторых пояснительных rem комментариев:

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 

rem // Define constants here: 
set "_FILE=%~1" & rem // (`%~1`: specify input file by command line argument) 

rem // Read the input file line by line, split off prefix (`FILE:`): 
for /F "tokens=2,* eol=: delims=: " %%K in (' 
    rem/ Filter for lines with matching prefix: ^&^
    findstr /R /C:"^FILE:[^:\\ ][^:\\ ]* *[0-9][0-9]*: *" "%_FILE%" 
') do (
    rem // Return prefixed file name at `STDERR` stream: 
    >&2 echo **** %%K **** 
    rem // Process current line without prefix in sub-routine: 
    call :EXTRACT "%%L" 
) 

endlocal 
exit /B 


:EXTRACT val_string 
    setlocal DisableDelayedExpansion 
    rem // Store string argument in variable: 
    set "LINE=%~1" 
    setlocal EnableDelayedExpansion 
    :EXTRACT_LOOP 
    rem // Check whether beginning of string matches a colour block: 
    cmd /V /C echo(^^!LINE^^! | (> nul^
     findstr /R /I /C:"^[0-9][0-9]*: *(*[0-9][0-9]* *, *[0-9][0-9]* *, *[0-9][0-9]* *) *#[0-9A-F][0-9A-F]* *[a-z][a-z]* *" 
    ) && (
     rem // String matches, so continue; extract first number and word: 
     for /F "tokens=1,6,* delims=:(,)# " %%A in ("!LINE!") do (
      endlocal 
      rem // Return number and word extracted from colour block: 
      echo(%%A: %%B 
      rem // Assign remainder to variable: 
      set "LINE=%%C" 
      setlocal EnableDelayedExpansion 
     ) 
     rem // Jump back to beginning of loop: 
     goto :EXTRACT_LOOP 
    ) 
    endlocal 
    endlocal 
    exit /B 

Предположив пакетного файл сохраняются как extract-colours.bat и текстовый файл называется sample.txt запустить скрипт так:

extract-colours.bat "sample.txt" 

Если текстовый файл содержит ваш пример данных, вывод будет таким:

**** 71.jpg **** 
88557: black 
535: blue 
3617: lime 
315: cyan 
9674: red 
214: magenta 
5552: yellow 
11536: white 

Чтобы сохранить результат в другой текстовый файл, используйте эту COMAND строку:

extract-colours.bat "sample.txt" > "result.txt" 

Поскольку строки заголовка части между парой **** (71.jpg здесь) возвращается в STDERR потока, в отличие от другие строки, которые выводятся в STDOUT, этот заголовок не включен в файл; чтобы включить его, добавьте 2>&1 в вышеупомянутую командную строку; если нет, чтобы подавить заголовок в окне консоли, вместо этого добавьте 2> nul. Прочтите эту статью, чтобы узнать, что все это значит: Redirection.

Смежные вопросы