【问题标题】:Batch, if line does not have text, echo previous line批处理,如果行没有文本,则回显上一行
【发布时间】:2014-08-29 12:42:28
【问题描述】:

我正在尝试逐行读取文本文件,如果一行为空,我希望它不应该是 echo -1 行。

文本文件包含如下文本:

Town
Hereford
C:\Installer.exe
192840573



Town
Greenock
C:\Installer.exe
192840573



Town
York



Town
Ipswich
C:\Installer.exe
192840573

我想做的是回应 York 没有 Installer.exe 这因城镇而异,并且多个城镇可能缺少安装程序。

非常感谢所有帮助。

【问题讨论】:

  • 当我输入问题时,文件有我用 \r\n 表示的新行,但帖子已重新格式化。
  • 在网上搜索并尝试很多我不确定他们的过程的例子。
  • 我还需要确定城镇是否有安装程序检查大小是否符合预期,例如 192840573

标签: batch-file cmd batch-processing


【解决方案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 语法使字符串比较不区分大小写;在这里可能没有必要,但在这种情况下也是无害的。

【讨论】:

  • 太完美了。非常感谢。
  • @corythompson - 如果启用延迟扩展并将CALL ECHO %%townname%% 替换为echo !townname!,此解决方案的速度可以提高近5倍
【解决方案2】:

Magoo 的解决方案有效,但对于大文件可能会很慢。

这是另一种使用 FINDSTR 搜索换行符的解决方案。如果文件很小,那没关系。但是如果文件有数千行,那么这个解决方案会明显更快(在我的机器上是 6 倍)。即使修改为使用延迟扩展,该解决方案仍然比 Magoo 的解决方案快一些。

我必须创建一个带有额外行的临时副本,以防最后一个 Town 缺少安装程序。

我的代码假定文件名为 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"

【讨论】:

    猜你喜欢
    • 2011-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多