批处理文件以搜索文本并将其写入文本文件

时间:2012-10-23 20:09:50

标签: batch-file

我有一个大的(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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

与任何批处理解决方案一样,行数限制为~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"
  )
)