2017-03-02 28 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'忽略行首的任何空格? –