2017-03-02 26 views
-1

(EDITED)如何從文本文件中讀取數據並將其中的某些部分分配給變量?例如,在下面的幾行中,我想將數據分配給指定的變量,但忽略標題行,序言詞「DATA:」和任何引號。使用FINDSTR在FOR循環中設置變量

HEADER (ignore) 
    DATA: "set text inside quotes to VAR1" 
    DATA: "set text inside quotes to VAR2" 
    DATA (etc.) 

我正在使用的代碼是:

setlocal enabledelayedexpansion 
set COUNT=0 
for /f "usebackq delims=" %%a in ("data.txt") do (
    set "INPUT=%%a" 
    set /a COUNT=!COUNT!+1 
    echo !INPUT! | findstr /i /c:"HEADER" > nul 
    if errorlevel 1 (
    set "INPUT=!INPUT:DATA:=!" 
    set "INPUT=!INPUT:"=!" 
    set VAR!COUNT!=!INPUT! 
    echo Variable !COUNT! = !VAR!!COUNT! 
) 
) 

我的預期輸出是

Variable 1 = set text inside quotes to VAR1 
Variable 2 = set text inside quotes to VAR2 

但我得到的是

Variable 2 = 2 
Variable 3 = 3 
Variable 4 = 4 

我在做什麼錯?

+7

請向我們展示您現有的代碼。 – Squashman

+2

Findstr不會迭代,它會對符合給定條件的輸入行進行過濾,對於/ f可能會迭代過濾後的行。 [SO]這裏每天都有很多例子。 – LotPings

回答

2

我把你的代碼修好了。 特別是:

  • 我切換findstr發現不匹配HEADER
  • 我用數組存儲變量的所有行。

它可能需要一些小的調整才能完全按照您的要求進行調整,但我想我已經給了您一個工作大綱。


@echo off 
setlocal enabledelayedexpansion 
set COUNT=0 
for /f "tokens=*" %%a in ('findstr /i /v HEADER data.txt') do (
    set "INPUT=%%a" 
    set /A COUNT=!COUNT!+1 
    set "INPUT=!INPUT:DATA:=!" 
    set VAR[!COUNT!]=!INPUT! 
    call echo Variable !COUNT! = %%VAR[!COUNT!]%% 
) 

輸出

Variable 1 = "set text inside quotes to VAR1" 
Variable 2 = "set text inside quotes to VAR2" 
Variable 3 = DATA (etc.) 


以匹配具有前導空格線,使用交換機:

findstr /V /R /C:"^ *HEADER" 

的常規電子郵件上的表達的意思是:

^  : Beginning of line 
[space] : a literal space 
*  : the previous character (space) repeated as many times as needed 
HEADER : the text to find after leading spaces 

開關意味着:

  • /R使用正則表達式
  • /C:使用此搜索字符串
  • /V顯示的是不要在該表達式匹配的所有行。
+0

謝謝,abelenky。我看到你做了什麼,並認爲我終於明白爲什麼FINDSTR命令進入FOR行而不是ECHO行。期待以更大規模嘗試這一點,並將CMD文件分配給Directory Opus工具欄按鈕。 –

+0

在第4行中,我知道我可以使用'FINDSTR/b'開關來查看單詞「標題」的輸入行的開始,我希望限制搜索以防止單詞「標題」出現在「DATA」行中。然而,/ b開關,如果它們碰巧有一個前導空間,則不能殺死「HEADER」行。有沒有辦法讓'FINDSTR'忽略行首的任何空格? –