2017-01-11 32 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:(="%用雙引號交換圓括號以簡化解析。
換檔命令跳過第一個參數,然後進入下一個參數。 Sub中的findstr會放棄不需要的元素。
if檢查當前參數是否有尾隨冒號,如果是通過set/p輸出而沒有crlf,如果不是簡單回顯當前arg。

1

以下是一個相當健壯的腳本,它從作爲命令行參數提供的文本文件中提取顏色信息。該文本文件甚至可能包含多行。該腳本只處理以文字字符串FILE:開頭的行,後面跟着一個不包含:,\,SPACE(如您示例中的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