批处理脚本,在文本文件中查找字符串并分成多个输出文件

时间:2013-10-09 01:07:40

标签: batch-file

我有一个文本文件,我们将调用info.txt,这个文本文件包含许多长行,每行都有一些标记,如下所示:

A bunch of usless info {tag15}data data{Tag1}data {Tag2}data {Tag11}data {Tag1}data {Tag2}

因此,在本文档中,我需要找到{Tag15}并在{Tag15}和{Tag11}之间拉取所有内容,或者它可以是另一个{Tag15}并将该段数据放入新的文本文件中。所以我有一个15.txt和一个11.txt包含正确的数据段,包括它和下一个Tag字符串之间的所有标签。所以在这个例子中15.txt将包含:

{tag15}data data{Tag1}data {Tag2}data data
{tag15}data data{Tag1}data {Tag2}data data data data {Tag3}data 
{tag15}data data{Tag1}data {Tag2}data 

而11.txt将包含:

{Tag11}data {Tag1}data {Tag2}data data data {Tag3}data
{Tag11}data {Tag1}data {Tag2}data
{Tag11}data {Tag1}data {Tag2}data data

据说我能看到的最合理的方法是找到所有Tag15和Tag11并将它们移动到一个新行,这样我们就不必确定数据集的长度,因为它可以用于每个标签集。然后通过另一个findstr处理文件并将每个匹配的行拉出到适当的文件。我不知道该怎么做是在找到{tag15}或{tag11}的行的确切位置插入一个新行。有什么想法吗?

总的来说,文本文件将包含大约200-300个这些标记集,需要对这些标记集进行解析并排序到相应的txt文件中。提前感谢您提供的任何帮助。

我对其他解决方案持开放态度,而不仅仅是批量解决方案,它恰好是我最熟悉的。

编辑:

我可以理解为什么这里需要更多的信息,并为不提供它开始道歉。因此,源文件每行中的标记段始终以{tag15}或{tag11}开头,但该段内的标记可能会因所推送的数据而异,例如,如果Tag2填充为Y而不是Tag3是必需的但如果Tag2为N而不是Tag3将不存在于段中,但tag5,6或200可能。这就是为什么我觉得最好找到Tag15或11并将其移动到它自己的行,这样你就不必依赖于试图确定你想要移动的字符串的长度。示例15.txt和11.txt旨在说明由于每个段的数据不同而可能看起来像什么,但这里是源文件可能看起来像生成的那些:

Line1: FirstLast 55555555 10092013 0000000 {tag15}data data{Tag1}data {Tag2}data data {tag15}data data{Tag1}data {Tag2}data data data data {Tag3}data {Tag11}data {Tag1}data {Tag2}data data data {Tag3}data
Line2: FirstLast 444444444 10092013 000000005 {Tag11}data {Tag1}data {Tag2}data {tag15}data data{Tag1}data {Tag2}data {Tag11}data {Tag1}data {Tag2}data data

我的想法是你把这个包含所有数据的文件找到Tag15和Tag11并将它们移动到它们自己的行,这样文件看起来像这样:

FirstLast 55555555 10092013 0000000 
{tag15}data data{Tag1}data {Tag2}data data 
{tag15}data data{Tag1}data {Tag2}data data data data {Tag3}data 
{Tag11}data {Tag1}data {Tag2}data data data {Tag3}data
FirstLast 444444444 10092013 000000005 
{Tag11}data {Tag1}data {Tag2}data 
{tag15}data data{Tag1}data {Tag2}data 
{Tag11}data {Tag1}data {Tag2}data data

既然每一行都是它自己的段,我们只需运行一个带有Findstr的For循环并将这些行回显到正确的txt文件或者我错过了什么?我之前提到的最大问题是我不确定如何将文件从其原始状态转换为上面的示例,以便可以对其进行排序,而无需知道我们尝试提取的字符串的确切长度。我希望这有帮助

2 个答案:

答案 0 :(得分:0)

这使用了来自 - http://www.dostips.com/forum/viewtopic.php?f=3&t=3855

的名为repl.bat的帮助程序批处理文件

repl.bat放在与批处理文件和文本文件相同的文件夹中。

对您的文件示例尝试此命令 - i中的ix是为了使其不区分大小写,因为您的代码的情况不同。

type file.txt |repl "{tag15}" "\r\n{tag15}" ix |repl "{tag11}" "\r\n{tag11}" ix >newfile.txt

任务仍然非常混乱/不清楚。

答案 1 :(得分:0)

所以我最终使用的工具让我感觉更舒服,并为Windows安装了Sed。我从使用AWK的建议中得到了这个想法。由于此脚本只能在一个地方运行,因此我决定安装非本机工具不是问题。以下是我提出来解决这个问题的方法:

Set sed=(the path to sed.exe for windows)
set filedir=Dir the source file is in
set file=name of source file
set wout=tag15.txt 
set win=tag11.txt

:: Locate "FTI0811 " which occurs prior to every {Tag15} tag and call a new line
%sed% -i -c --expression="s/FTI0811 /&\n/g" %filedir%%file%
:: Locate XFT811  which occurs prior to every {Tag11} tag and call a new line
%sed% -i -c --expression="s/XFT811 /&\n/g" %filedir%%file%
:: Find all strings that start with {Tag15} and echo them out to the Wires Out file variable
findstr "{tag15}" %filedir%%file% >> %wout%
:: Find all strings that start with {tag11} and echo them out to the Wires In file variable
findstr "{tag11}" %filedir%%file% >> %win%

感谢大家的帮助和想法。请随时编辑/评论我的方法,我总是非常乐意收到反馈。对不起,这个问题对某些人来说有点模糊,由于我的工作,我无法发布整个源文件及其包含的内容。再次感谢!