2012-10-23 83 views
3

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

  1. 输入文件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 43Ñ36 15.44568 79 w^32 38.2275467.892米0,12082011c.lst

    0.014 0.014 0.014,12082011c.lst

  2. 搜索词: “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。

+0

批处理不是文本处理的好选择。它可以完成,但它会变得复杂,可能慢得令人无法接受。如果您想使用本地Windows脚本工具,那么使用PowerShell,VBScript或JScript会更好。如果你被允许使用第三方工具,那么像Windows sed这样的工具将是完美的。 (Gnu有一个可用于Windows的sed的免费端口) – dbenham

+0

此外,批处理只能处理长达8191字节的行。 (实际上少一点,但确切的数值取决于代码) – dbenham

+0

非常感谢您的反馈。我确实感觉到我正步入复杂的领域。我正在尝试批处理路由,因为它很容易获得,但是我可以看到它具有局限性。 – Gabe

回答

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

这工作完美!你的假设是正确的。非常感谢你。 – Gabe

相关问题