我是DOS新手。事实上,我是一个Java人。我需要做一些字符串搜索操作,但不幸的是字符串搜索& java中的文件搜索操作相当慢。它的速度非常快。
所以这是我的问题。我需要搜索具有固定扩展名(.sp)的所有文件,用于2个固定字符之间的字符串(所有行)。他们是 ';' &安培; ';'
这是.sp文件之一的内容。
文件: - Tons.sp
line 1: Skipcheck;
line 2: [Scenario:'Actual']=STET;
line 3: ['WFS':'Actual','Scenario':'Actual','Measure':'Units']=N:
line 4: IF( SUBST( !Measure, 1, 1) @= '8'
line 5: ,
line 6: ['Amount']
line 7: ,
line 8: STET
line 9: );
line10:
line11: ['Tons'] = N:
line12: DB('Volume Master',!Version,!Year,!Plant,'GL_CODE_0004',!Period,!Measure) ;
line13:
line14: ['Group1_Volume'] = N:
line15: IF ( ELISANC( 'Plant', 'Group1' , !Plant )=1
line16: , ['Take_This']
line17: , CONTINUE
line18: );
line19:
line20: ['Tons Trend']=N:
line21: IF( DB('Monthly_Trend', !Period, 'Tons_Trend_Factor') > 0
line22: , 'Current_Tons' * DB('Volume Master',!Version,!Year,!Plant,'GL_CODE_TonsProduced',!Period,!Measure)
line23: , CONTINUE
line24: );
请注意:行号仅供参考。
问题1:现在我需要找到位于';'之间的字符串(所有行) &安培; ';'包含字符串“DB('Volume Master'” ie。:findstring将是这样的: -
FINDSTR /n "=*DB('Volume Master'*;" *.sp
上述命令的结果应该是10到12行&第19至24行
line10:
line11: ['Tons'] = N:
line12: DB('Volume Master',!Version,!Year,!Plant,'GL_CODE_0004',!Period,!Measure) ;
&安培;
line19:
line20: ['Tons Trend']=N:
line21: IF( DB('Monthly_Trend', !Period, 'Tons_Trend_Factor') > 0
line22: , 'Current_Tons' * DB('Volume Master',!Version,!Year,!Plant,'GL_CODE_TonsProduced',!Period,!Measure)
line23: , CONTINUE
line24: );
问题2:此输出: -
FINDSTR /n "=*DB('Volume Master'*'GL_CODE_TonsProduced'*;" *.sp
应该是: -
line19:
line20: ['Tons Trend']=N:
line21: IF( DB('Monthly_Trend', !Period, 'Tons_Trend_Factor') > 0
line22: , 'Current_Tons' * DB('Volume Master',!Version,!Year,!Plant,'GL_CODE_TonsProduced',!Period,!Measure)
line23: , CONTINUE
line24: );
请帮忙。
感谢
克里希纳
答案 0 :(得分:0)
@ECHO Off
SETLOCAL
SET "destdir=U:\destdir"
SET "target=DB('Volume Master'"
SET "target=DB('Volume Master'.*'GL_CODE_TonsProduced'"
SET "blockend=;"
DEL "%destdir%\res*" 2>nul
FOR /f "delims=" %%a IN (q24237940.txt) DO (
>>"%destdir%\res.tmp" ECHO(%%a
ECHO(%%a|FINDSTR /l /c:"%blockend%">NUL
IF NOT ERRORLEVEL 1 (
FINDSTR /r /c:"%target%" "%destdir%\res.tmp" >NUL
IF NOT ERRORLEVEL 1 TYPE "%destdir%\res.tmp" >>"%destdir%\res.txt"
DEL "%destdir%\res.tmp" /F /Q
)
)
GOTO :EOF
我使用了一个名为q24237940.txt
的文件,其中包含我的测试数据。
为方便起见,我使用了变量; destdir
包含结果文件的目标目录,target
表示必须在块内发生的目标字符串,blockend
表示字符串结尾的字符串。
请注意,我在代码中保留了两个目标,后一个将被使用。 findstr
逐行查找,因此在此示例中,DB...
和GL_CODE...
必须出现在同一行。由于findstr尝试使用正则表达式,.*
表示any number of any character
- 其中characer集不包含换行符。
本质上,一次创建包含块的res.tmp
,当找到块结束时,检测该tempfile是否包含魔术字符串;如果有,请附加到res.txt
。