3

我有一个大(20MB)文本(输入)文件,其中包含各种文本行(包括空白行)。我想要一个批处理文件,它可以在输入文件中找到特定文本,获取搜索词所在的字符串,将该字符串写入另一个文本(输出)文件,并在该字符串后面附加一个空格、逗号和后面的行在输出文件中的输入文件中。

  1. 输入文件数据:

    NORTHING         EASTING   O-HEIGHT     CODE FFF STATION   STD DEV MAPPROJ 
    

    NEO 000 020720618 4829559.470 ,12082011c.lst

    0.015 0.015 0.015
    NEO 000 020740188 4835430.827 ,12082011c.lst

    0.009 0.009 0.009
    NEO 000 020750232 4841535.651 ,12082011c.lst

    0.004 0.004 0.004
    PLH 000 020720615 N 43 36 15.44568 W 79 32 38.22754 67.892 m 0 ,12082011c.lst

    0.014 0.014 0.014 ,12082011c.lst

  2. 搜索词:“NEO”

  3. 输出:

    Neo 000 020720618 4829559.470,12082011C.LST,0.015 0.015 0.015
    Neo 000 020740188 4835430.827,12082011C.LST,0.009 0.009 0.009
    Neo 000 020750232 4841535.651,12082011C.LST,0.004 0.004 0.004

我尝试使用 findstr 命令,它会写入该行的第一部分( NEO 000 020720618 4829559.470 ,12082011c.lst),但我不知道如何获取下一行并将其附加到字符串中。(字符串比我在这个例子中显示的要长,所以如果变量有字符限制,请告诉我)。谢谢,加布。

4

1 回答 1

1

正如我在评论中指出的那样,批处理不是处理文本文件的好选择。但这里有一个针对您的问题的本机批处理解决方案。我假设您正在搜索第一个令牌是 NEO 的行,而不是在其中任何地方包含 NEO 的行。

看起来您想忽略空行,这很好,因为 FOR /F 忽略了空行。

;由于默认的 FOR /F EOL 选项,此解决方案还将忽略任何以开头的行。这可以通过将 EOL 设置为换行符来消除,但语法很难看。我假设您没有以 . 开头的行;

与任何批处理解决方案一样,行数限制为 ~8191 字节。

@echo off
setlocal disableDelayedExpansion
set "ln1="
>"output.txt" (
  for /f "useback delims=" %%A in ("input.txt") do (
    if defined ln1 (
      set "ln2=%%A"
      setlocal enableDelayedExpansion
      echo(!ln1! ,!ln2!
      endlocal
      set "ln1="
    )
    for /f %%B in ("%%A") do if "%%B"=="NEO" set "ln1=%%A"
  )
)
于 2012-10-24T14:18:43.983 回答