我试图逐行读取文本文件,如果一行是null,我认为它不应该是echo -1 line。
文本文件包含如下文本:
Town
Hereford
C:\Installer.exe
192840573
Town
Greenock
C:\Installer.exe
192840573
Town
York
Town
Ipswich
C:\Installer.exe
192840573
我想做的是回复约克没有Installer.exe 这因城镇而异,多个城镇可能缺少安装人员。
所有人都非常感谢。
答案 0 :(得分:1)
@ECHO Off
SET "Town="
SET "Townname="
SETLOCAL
FOR /f "delims=" %%a IN (q25568537.txt) DO (
IF DEFINED town IF NOT DEFINED townname SET "townname=%%a"
IF /i "%%a"=="Town" (
IF DEFINED townname CALL ECHO %%townname%%
SET "Town=Y"
SET "Townname="
)
IF /i "%%a"=="C:\Installer.exe" SET "Townname="&SET "town="
)
IF DEFINED town IF DEFINED townname CALL ECHO %%townname%%
GOTO :EOF
我使用了一个名为q25568537.txt
的文件,其中包含我的测试数据。
请注意,批处理环境变量不区分大小写。 if /i
语法使字符串比较不区分大小写;这里可能没有必要,但在这种情况下也是无害的。
答案 1 :(得分:0)
Magoo的解决方案可行,但对于大文件来说可能会很慢。
这是另一种使用FINDSTR搜索换行符的解决方案。如果文件很小,那么它并不重要。但是如果文件有数千行,那么这个解决方案明显更快(我的机器上的因子为6)。这个解决方案仍然比Magoo的解决方案快一点,即使它被修改为使用延迟扩展。
我必须创建一个附加额外行的临时副本,以防最后一个城镇缺少安装程序。
我的代码假设该文件名为test.txt
@echo off
setlocal enableDelayedExpansion
set file=test.txt
::Define LF variable containing a linefeed (0x0A)
set ^"LF=^
^" Above empty line is critical - DO NOT REMOVE
::Define CR variable containing a carriage return (0x0D)
for /f %%a in ('copy /Z "%~dpf0" nul') do set "CR=%%a"
(type "%file%"&echo(&echo()>"%file%.new"
findstr /ir /c:"[a-z].*!CR!*!lf!!CR!*!LF!" "%file%.new"
del "%file%.new"