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

3

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

  1. INPUT FILE DATA:

    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. SEARCH TERM: "NEO"

  3. OUTPUT:

    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),但我无法弄清楚如何抓取下一行并将其附加到字符串中。(如果变量有字符限制,请告诉我,因为这些字符串比我在示例中显示的要长。)谢谢,Gabe。

批处理不是文本处理的好选择。虽然可以完成,但会变得复杂且可能无法接受地缓慢。如果您想使用本机Windows脚本工具,则最好使用PowerShell、VBScript或JScript。如果允许使用第三方工具,则像Windows的sed这样的实用程序将是完美的选择。(Gnu为Windows提供了sed的免费端口) - dbenham
此外,批处理只能处理长度不超过8191个字节的行。(实际上略少于此值,但确切数值取决于代码) - dbenham
非常感谢您的反馈。我确实感觉自己走进了复杂的领域。我尝试使用批处理路线,因为它很容易获取,但我可以看到它有其局限性。 - Gabe
1个回答

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"
  )
)

这个运行非常完美!你的假设是正确的。非常感谢你。 - Gabe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接